gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:43:00 60 4
gpt4 key购买 nike

我试图使用 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) 4.8.5 20150623(红帽 4.8.5-4)
  • GDB 是 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)

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

最佳答案

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

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

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

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

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

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

关于gcc - 为什么 GDB 不显示行号或函数名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40475306/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com