我有一个我正在编写的程序,而且我遇到了一些内存错误。我通过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中没有显示行号或变量名?
答案 0 :(得分:2)
GDB本身已经提供了您没有看到行号或变量名的原因:
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
GDB认为,某些错误会导致无法安全恢复的情况,并且不会尝试进一步解码回溯堆栈。它诊断错误的可能原因是一个损坏的堆栈。
您可以通过几种方式继续调试问题。一种方法是尝试使用valgrind
来查看它是否可以为您识别损坏的来源。如果它尚未安装在您的系统上,则RPM包应该可用,并以常规方式检索(可能apt-get
或yum
,具体取决于您的Linux提供商。)
您还可以尝试在调试器中单步执行程序,直到发生错误。这至少会告诉您程序中发生错误的代码行。然后,您可以重复实验直到错误,并在错误实际发生之前检查程序的状态。