python - gdb 从哪里获取函数名?

标签 python debugging gdb

我正在查看使用 GDB 的实时 python 进程并看到以下帧:

...
#5  call_function (oparg=<optimized out>, pp_stack=0x7fffb1b2ffa0) at Python/ceval.c:4084
#6  PyEval_EvalFrameEx (f=f@entry=0x1a03850, throwflag=throwflag@entry=0) at Python/ceval.c:2679
...

不过,我对 call_function 从何而来感到困惑。它似乎不是 python 可执行文件或二进制文件中的符号:

~  ᐅ objdump -x /usr/lib/libpython3.3m.so.1.0 | grep call_function
000000000005f0e0 l     F .text  0000000000000094              call_function_tail

如果它不是一个已知符号,GDB 是如何知道它的……它到底是什么(当然除了它是一个普通函数)?

最佳答案

它在 Python 解释器的源代码中,你的 gdb 说在哪里,但你可以检查它 here ,尽管在不同的行中:3971。

函数的定义是:

static PyObject * call_function(PyObject ***pp_stack, int oparg);

因为它是一个static函数,所以它有内部链接,所以它在它的编译单元之外是不可见的,更不用说在它的动态库(.so 文件)之外了。

调试器知道它是因为它可以以某种方式访问​​正在运行的代码的调试信息。

关于python - gdb 从哪里获取函数名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19083376/

相关文章:

node.js - 如何在 VSCode 中调试 nodemon 项目

c - GDB设置多个断点

c - 编写 GDB 脚本来收集数据

python - 使用 python (win32com.client) 将图像插入 powerpoint 幻灯片

c# - Visual Studio Xamarin : Could not connect to the debugger

python - 打印循环出队的非空部分

python - 如何在不运行脚本的情况下调试 Python 代码(使用 Eclipse)?

debugging - 在Qt中设置断点后,gdb显示: "Error accessing memory address"

python - 即使使用当前 python 版本安装 Numpy 导入错误

python - 从文本文件创建用户名