【问题标题】:GDB Backtrace Containing Similar Addresses but Different Source Lines包含相似地址但不同源行的 GDB 回溯
【发布时间】:2019-11-27 12:41:28
【问题描述】:

我试图调试inkscape 并在其主共享库中的某个地址(即/usr/lib/inkscape/libinkscape_base.so)处放置一个断点。当执行到达该断点时,回溯如下:

#0  0x00007ffff6ecb220 in __static_initialization_and_destruction_0 (__priority=65535, __initialize_p=1) at /usr/include/c++/7/iostream:74
#1  0x00007ffff6ecb220 in _GLOBAL__sub_I_log_display_config.cpp(void) () at ./src/debug/log-display-config.cpp:83
#2  0x00007ffff7de5733 in call_init (env=0x7fffffffddd8, argv=0x7fffffffddc8, argc=1, l=<optimized out>) at dl-init.c:72
#3  0x00007ffff7de5733 in _dl_init (main_map=0x7ffff7ffe170, argc=1, argv=0x7fffffffddc8, env=0x7fffffffddd8) at dl-init.c:119
#4  0x00007ffff7dd60ca in _dl_start_user () at /lib64/ld-linux-x86-64.so.2
#5  0x0000000000000001 in  ()
#6  0x00007fffffffe176 in  ()
#7  0x0000000000000000 in  ()

可以看出,#0#1 指向同一个地址但不同的源位置。 #2#3 也是如此。怎么可能?

【问题讨论】:

    标签: debugging gdb backtrace virtual-address-space debug-information


    【解决方案1】:

    这怎么可能?

    内联是可能的。

    GCC 为 GDB 发出足够的调试信息,以告知特定地址,即使它物理上位于 bar 内,实际上属于内联 foo

    由于foo“不存在”,但对它的调用是由 GDB 在backtrace 输出中合成的,因此 GDB 为其打印的地址有些无关紧要。

    GDB 过去根本不打印地址(我的版本8.3.50.20190824-24.fc31 仍然如此),但我想这并不可靠,有时 GDB 可能只是重复之前的返回地址。

    【讨论】:

    • 谢谢。需要注意的一点是,代码中有许多手动堆栈指针修改,包括在这个断点周围,例如,add $0x8,%rsp 和之后的几行我们有sub $0x8,%rsp。这些行会使回溯输出不可靠吗?
    猜你喜欢
    • 2018-07-05
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多