帮助调试崩溃日志的gdb

3
我一直在使用GDB(C代码)进行调试。问题是,如果我运行我的应用程序并且它崩溃了,控制权会回到main()(应用程序重新启动)。因此,我不知道它在哪里崩溃了。所以我花费了很多时间逐步执行每个函数。
我想知道是否有任何方法可以启用日志,在崩溃之前生成最后一行执行的代码。这只是我的假设,如果有其他更简单的方法,请告诉我,这将为我节省大量时间!
另外,如果gdb生成日志,路径在哪里?
提前感谢。

2
你能定义一下“崩溃”吗?如果有未处理的信号(例如SIGSEGV),GDB应该拦截它并立即停止,但听起来这不是正在发生的事情,所以你必须以不同的方式“崩溃”了。 - Michael Mrozek
1
GDB可以处理预设命令,只要你能够使用它们。或者,如果你所说的日志是指堆栈跟踪,请查看http://tlug.up.ac.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV。它展示了如何在SIGSEGV上生成堆栈跟踪。如果你知道哪个信号导致了崩溃,请在接收到该信号时生成堆栈跟踪,而不是SIGSEGV。 - vpit3833
控制返回到main()并重新启动应用程序并不是完全相同的事情 - 它真的在main()的第1行重新启动,还是只是回到某个函数调用错误并返回后面的行? - Cascabel
@vpit3833:不错的链接 :) - leppie
@Jefromi:不,执行后它不会回到同一个函数。它会重新开始所有的初始化过程,这意味着应用已经重新启动了。 - kp11
@ Michael Mrozek:您是正确的,它会抛出SIGSEGV异常,但不会显示发生在哪里。它会在gdb上抛出该异常并重新启动。 - kp11
2个回答

4
这个问题对我来说有点不清楚,但是我会尽力回答: 如果在程序崩溃时已经连接了GDB,那么崩溃应该会停止程序并将您带回提示符。然后键入,您应该可以看到堆栈。 如果您没有连接GDB,那么此相关问题的答案可能会有所帮助。(简而言之,也许您希望系统在程序崩溃时创建一个核心转储。核心转储只是包含有关崩溃进程的大量信息的文件。您可以使用具有核心转储的GDB来查看堆栈。) 如果您不知道,请发布发生这种情况时屏幕上显示的内容,我们会猜测。
无论如何,程序绝对不应该重新从main()开始。追踪为什么会发生这种情况以及确切发生了什么似乎是值得的。控制是否真的跳转到main在同一进程中,而不是以某种方式自动启动另一个进程?

3

以gdb模式运行您的程序。

 $ gdb ./myProgram


将断点设置到预期位置。

 $ break functionName


或者设置断点到特定的行号。

 $ break 15


开始执行

 $ r


通过键入's'或'n'来进入或退出执行

 $ s


程序崩溃后,执行'bt'命令获取回溯信息。

 $ bt


您可以使用'up'和'down'命令在跟踪中向上或向下移动

 $ up


也可以采用替代方法。使用“core”作为核心转储文件调试程序。

 $ gdb executableFilename core
 $ bt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接