【问题标题】:Where does gdb get function names from?gdb 从哪里获取函数名?
【发布时间】:2013-09-29 21:18:24
【问题描述】:

我正在查看使用 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
...

我对@9​​87654322@ 的来源感到困惑。它似乎不是 python 可执行文件或二进制文件中的符号:

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

如果它不是一个已知的符号,GDB 是如何知道它的...以及它究竟是什么(当然除了它是一个普通函数)?

【问题讨论】:

    标签: python debugging gdb


    【解决方案1】:

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

    函数定义为:

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

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

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

    【讨论】:

    • 呸...我被objdump -x 被描述为--all-headers 所愚弄。 call_function 的地址可以通过 -g/--debugging 恢复 - 你是对的。
    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 2013-11-01
    • 2020-09-04
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多