GDB下的可执行文件调用不同的嵌入式Python

0 投票
1 回答
26 浏览
提问于 2025-04-12 12:48

我有一段代码,它里面嵌入了Python。这个嵌入的Python使用了NumPy,所以我需要明确加载一下libpython,这样NumPy才能正常工作。

主要的代码是用C++写的(在Google Test中进行测试)。但是在某个地方出现了bug,我想用gdb来调试。不过,奇怪的是,当我直接运行可执行文件和在gdb下运行这个可执行文件时,嵌入的版本是不同的。

我通过在初始化的嵌入式Python中实例化sysconfig模块,然后使用sysconfig.get_config_var("LIBDIR")来找到libpython的路径。

当我直接运行可执行文件时,我记录下找到的libpython的路径:

Path to libpython is /home/dima/.conda/envs/um02-open-interfaces/lib

当我在gdb下运行同样的可执行文件时:

Path to libpython is /home/linuxbrew/.linuxbrew/opt/python@3.11/lib

我该如何阻止gdb改变环境?

1 个回答

1

如何阻止gdb改变环境变量?

GDB并不会自己去改变环境变量。不过,它会调用你的 $SHELL,如果你有 ~/.bashrc 或类似的文件在改变环境变量,那么这些变化会影响到通过GDB的 run 命令启动的任何进程。

你可以通过运行 $SHELL -c /path/to/your/program 来确认是否发生了这种情况。如果它打印出错误的 libpython 路径,那很可能就是问题的根源。

解决办法是让 .bashrc 只在 交互式 shell 中改变环境变量。

你也可以通过在GDB中使用 set startup-with-shell off 来禁用中间的 $SHELL文档)。

撰写回答