gdb从哪里获取函数名称?

时间:2013-09-29 21:18:24

标签: 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如何知道它......它到底是什么(当然它是正常的功能)?

1 个答案:

答案 0 :(得分:1)

它位于Python解释器的源代码中,你的gdb说明了哪里,但你可以检查它here,尽管在另一行:3971。

该功能的定义是:

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

由于它是static函数,因此它具有内部链接,因此它在编译单元外部不可见,更不用说超出其动态库(.so文件)了。

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