Debugging gdb调试崩溃日志的帮助

Debugging gdb调试崩溃日志的帮助,debugging,logging,crash,gdb,Debugging,Logging,Crash,Gdb,我一直在用GDB(C代码)进行调试。问题是如果我运行我的应用程序,如果它崩溃,控件将返回main()(应用程序重新启动)。因此不知道它在哪里坠毁。所以我花了很多时间逐步完成每个函数 我想知道是否有一个日志可以启用,它将生成崩溃前的最后一行执行。这只是我的假设,如果有其他更简单的方法,请告诉我,这将为我节省大量时间 另外,如果gdb生成一个日志,那么路径会在哪里 提前谢谢。这个问题对我来说有点不清楚,但我想尝试一下: 如果在崩溃进程崩溃时将GDB连接到崩溃进程,崩溃应该会停止程序并将您放回(GDB

我一直在用GDB(C代码)进行调试。问题是如果我运行我的应用程序,如果它崩溃,控件将返回main()(应用程序重新启动)。因此不知道它在哪里坠毁。所以我花了很多时间逐步完成每个函数

我想知道是否有一个日志可以启用,它将生成崩溃前的最后一行执行。这只是我的假设,如果有其他更简单的方法,请告诉我,这将为我节省大量时间

另外,如果gdb生成一个日志,那么路径会在哪里


提前谢谢。

这个问题对我来说有点不清楚,但我想尝试一下:

如果在崩溃进程崩溃时将GDB连接到崩溃进程,崩溃应该会停止程序并将您放回
(GDB)
提示符。如果然后键入
bt
,您应该会看到堆栈

如果您没有连接GDB,可能会有所帮助。(简而言之,当程序崩溃时,您可能希望系统创建一个核心转储。核心转储只是一个包含大量有关崩溃进程信息的文件。您可以使用GDB和核心转储来查看堆栈。)

如果您不知道,将发生这种情况时您在屏幕上看到的内容发布出来,我们将进行猜测


无论如何,程序绝对不应该在main()上重新启动。这似乎值得追踪为什么会发生这种情况,以及到底发生了什么。控件是否真的在同一进程中跳转到
main
,而不是以某种方式自动启动另一进程?

在gdb模式下运行程序

 $ gdb ./myProgram

将断点设置为预期位置

 $ break functionName

或将断点设置为特定行号

 $ break 15

开始执行

 $ r

通过“s”或“n”进入或退出执行

 $ s

一旦程序崩溃,请执行“bt”进行回溯

 $ bt

您可以通过“向上”和“向下”命令在跟踪中上下移动

 $ up

也可以采取其他方式。使用“core”作为核心转储文件调试程序

 $ gdb executableFilename core
 $ bt

你能定义“崩溃”吗?如果有未处理的信号(例如SIGSEGV),GDB应该立即拦截并停止,但听起来好像不是这样,所以你一定是在以不同的方式“崩溃”,GDB可以处理屏蔽命令,如果你可以的话。或者,如果log指的是堆栈跟踪,请查看。它显示了如何在SIGSEGV上生成堆栈跟踪。如果您知道是哪个信号导致了崩溃,那么在接收到该信号时生成堆栈跟踪,而不是SIGSEGV。返回main()的控件和重新启动应用程序实际上不是一回事-它真的是在main()的第1行重新启动吗,或者它只是在某个函数调用出现错误并返回后返回到该行?@vpit3833:Nice link:)@Jefromi:No它在执行后不会返回到同一个函数。它会再次启动所有初始化过程,这意味着应用程序已重新启动。