我一直在调试GDB(C代码)。问题是如果我运行我的应用程序,如果它崩溃,控制回到main()(应用程序重新启动)。因此不知道它在哪里崩溃。所以我花了很多时间来完成每个功能。帮助gdb调试崩溃日志记录
我想知道是否有无论如何可以启用日志,这将生成崩溃前的最后一行执行。这只是我的假设,如果还有其他更简单的方法,请让我知道,这将为我节省大量时间!
此外,如果gdb生成一个日志的路径是哪里?
在此先感谢。
我一直在调试GDB(C代码)。问题是如果我运行我的应用程序,如果它崩溃,控制回到main()(应用程序重新启动)。因此不知道它在哪里崩溃。所以我花了很多时间来完成每个功能。帮助gdb调试崩溃日志记录
我想知道是否有无论如何可以启用日志,这将生成崩溃前的最后一行执行。这只是我的假设,如果还有其他更简单的方法,请让我知道,这将为我节省大量时间!
此外,如果gdb生成一个日志的路径是哪里?
在此先感谢。
这个问题是一个小我不清楚,但我会采取刺伤:
如果您GDB连接到崩溃时的崩溃进程,崩溃,应停止该程序,并把你回来在(gdb)
提示。如果你输入bt
,你应该看到堆栈。
如果你没有附加GDB,然后this answer to a related question可能会有所帮助。 (简而言之,也许您希望系统在程序崩溃时创建核心转储,核心转储只是一个包含大量关于崩溃进程的信息的文件,您可以使用带有核心转储的GDB来查看堆栈。 )
如果你不知道,发布你在屏幕上看到这种情况时,我们会猜测。
在任何情况下,程序绝对不应该在main()重新开始。追查为什么发生这种情况以及发生了什么似乎是值得的。控制真的跳到main
在相同的过程,而不是另一个进程以某种方式自动启动?
在gdb模式下运行你的程序。
$ gdb ./myProgram
将断点设置为预期位置。
$ break functionName
或设置中断点为特定行号。
$ break 15
启动执行
$ r
步骤进入或通过的'走出执行或 'n' 个
$ s
一旦程序崩溃,做'bt'用于回溯。
$ bt
您可以通过'上' & '向下'命令
$ up
上去,在您的跟踪下来也可以采取另一种方法。以“核心”作为核心转储文件的调试程序。
$ gdb executableFilename core
$ bt
你能定义“崩溃”吗?如果有一个未处理的信号(例如SIGSEGV),GDB应该拦截它并立即停止,但是这听起来并非如此,因此您必须以不同的方式“崩溃”。 – 2010-12-01 04:26:45