我正在使用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如何知道它......它到底是什么(当然它是正常的功能)?
答案 0 :(得分:1)
它位于Python解释器的源代码中,你的gdb说明了哪里,但你可以检查它here,尽管在另一行:3971。
该功能的定义是:
static PyObject * call_function(PyObject ***pp_stack, int oparg);
由于它是static
函数,因此它具有内部链接,因此它在编译单元外部不可见,更不用说超出其动态库(.so文件)了。
调试器知道它,因为它可以以某种方式访问正在运行的代码的调试信息。