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