1

我有一个正在编写的程序,但出现了一些内存错误。我通过 gdb 运行它并where在发生内存错误后进行调用,我得到以下输出:

#0  0xb7fdd424 in __kernel_vsyscall ()
#1  0xb7f189b1 in ?? () from /lib/i386-linux-gnu/libc.so.6
#2  0xb7e979fe in ?? () from /lib/i386-linux-gnu/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

我之前也遇到过类似的错误,解决方案是使用 -ggdb 编译器选项。但我正在使用该选项,您将在我的 Makefile 中看到:

shell: myshell.c
        gcc -ansi -ggdb -Wall -pedantic-errors -o myshell myshell.c

为什么 gdb 中没有显示行号或变量名?

4

1 回答 1

2

GDB 本身已经提供了您没有看到行号或变量名的原因:

Backtrace stopped: previous frame identical to this frame (corrupt stack?)

GDB 认为某些错误造成了无法安全恢复的情况,因此不会尝试进一步解码回溯堆栈。它诊断错误的可能原因是堆栈损坏。

您可以通过几种方式继续调试问题。一种方法是尝试使用valgrind它来查看它是否可以为您识别腐败的来源。如果它尚未安装在您的系统上,则应该可以使用 RPM 包,并以通常的方式检索(可能是apt-getyum,取决于您的 Linux 提供商)。

您还可以尝试在调试器中单步执行您的程序,直到发生错误。这至少会告诉您程序中发生错误的代码行。然后,您可以重复实验直到出现错误,并在错误实际发生之前检查程序的状态。

于 2013-09-02T20:25:42.540 回答