为什么GDB不显示行号或函数名称?

问题描述 投票:0回答:1

我试图使用 GDB 来解决我正在编写的代码中的段错误。当我使用

backtrace
命令时,GDB 不显示行号或函数名称。这是一个简短的示例程序,说明了我的问题:

void segfault(int *b) {
    // This causes a segfault on CentOS7 Intel 64-bit
    b[-1] = 5;
}

void main() {
    int a[10];
    segfault(a);
}

但是当我编译时

gcc -ggdb -O0 test.c -o segfaulttest

并使用

gdb segfaulttest
运行它,当我使用 gdb 的 backtrace 命令时,我没有得到任何行号或函数名称。我希望它在跟踪中列出
main()
segfault()

输出示例

Reading symbols from /home/user/test/segfaulttest...done.
(gdb) run
Starting program: /home/user/test/segfaulttest 

Program received signal SIGSEGV, Segmentation fault.
0x000000050040051c in ?? ()
(gdb) bt
#0  0x000000050040051c in ?? ()
#1  0x0000000000000000 in ?? ()
(gdb) 

我正在使用:

  • CentOS 7(64 位)
  • 海湾合作委员会:
    gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
  • GDB 是
    gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)

(旁白:我修复了代码中的实际错误,我只是不明白为什么 gdb backtrace 不向我显示更多信息)。

gcc gdb
1个回答
7
投票

您已经破坏了包含 gdb 需要知道您的程序所在位置的信息的堆栈部分。

0x000000050040051c in ?? ()
  ^^^^^^^^

这是您代码编写的数字 5,一个 4 字节 int。

当 main() 启动时,返回地址存储在堆栈中。返回地址 这是 main() 完成后将返回的地方。这个地方是一个函数,它是运行时的一部分,称为 main()。

由于返回地址被代码破坏/覆盖,执行会尝试跳回到某个不存在的地址,这会导致崩溃。

该地址 0x000000050040051c 现在是程序计数器寄存器,当 SIGSEGV 信号传递到您的进程时它会被存储。 gdb 检查此信息,尝试找出与地址 0x000000050040051c 匹配的代码所在的位置 - 该代码不存在。

© www.soinside.com 2019 - 2024. All rights reserved.