我有以下堆栈跟踪.是否可以从中进行任何有用的调试?
Program received signal SIGSEGV, Segmentation fault.
0x00000002 in ?? ()
(gdb) bt
#0 0x00000002 in ?? ()
#1 0x00000001 in ?? ()
#2 0xbffff284 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb)
Run Code Online (Sandbox Code Playgroud)
当我们得到一个时,从哪里开始查看代码Segmentation fault,并且堆栈跟踪不是那么有用?
注意:如果我发布代码,那么SO专家会给我答案.我想从SO那里得到指导并自己找到答案,所以我不会在这里发布代码.道歉.
我正在研究多线程应用程序,我想使用GDB进行调试.
问题是,我的一个线程一直在消息中消失:
pure virtual method called
terminate called without an active exception
Abort
Run Code Online (Sandbox Code Playgroud)
我知道该消息的原因,但我不知道我的帖子在哪里发生.回溯真的很有帮助.
当我在GDB中运行我的应用程序时,每次线程暂停或恢复时它都会暂停.我希望我的应用程序继续正常运行,直到其中一个线程因该异常而死亡,此时所有内容都应该暂停,以便我可以获得回溯.
我希望能够在GDB中设置一个断点,让它运行到那一点 - 并在此过程中,打印出已经"逐步完成"的行.
这是一个例子,基于这个带有a main和a函数的简单文件,每个都有两个断点:
$ cat > test.c <<EOF
#include "stdio.h"
int count=0;
void doFunction(void) {
// two steps forward
count += 2;
// one step back
count--;
}
int main(void) {
// some pointless init commands;
count = 1;
count += 2;
count = 0;
//main loop
while(1) {
doFunction();
printf("%d\n", count);
}
}
EOF
$ gcc -g -Wall test.c -o test.exe
$ chmod +x test.exe
$ gdb -se test.exe
...
Reading symbols from /path/to/test.exe...done.
(gdb) b …Run Code Online (Sandbox Code Playgroud) 所以我正在调试这个程序,这个程序是我从即将毕业的博士生中继承的,或者是在学生完成论文后发生的任何事情.无论如何,现在我有责任进行调试.该程序基本上接受几个文本文件并处理它们.我遇到的问题(段错误)是因为程序试图访问尚未初始化的数组.我想知道是否有任何调试工具可以让你运行程序,并比较程序关闭的两个不同路径.我想我可以手动完成程序,但我宁愿不这样做,因为它相当大,我仍然没有掌握它.我一直在使用GDB和Valgrind(以及使用g ++ -wall来显示警告),这就是我如何做到这一点.
gdb ×4
c ×3
debugging ×3
c++ ×2
automation ×1
multicore ×1
polymorphism ×1
recursion ×1
valgrind ×1