当断言失败或存在分段错误时,发生以下情况之一将非常方便:
由于各种平台,语言和调试器,问题非常普遍。 我问的是C ++,我猜Windows(VS),Linux(gdb),Mac(gdb?)解决方案对社区最有用。我对Linux + gdb感兴趣。
答案 0 :(得分:3)
在Linux(可能是OSX和其他unixen)上,您可以允许程序使用ulimit
实用程序保留coredump。
这是一个快速howto。
答案 1 :(得分:2)
在Windows上有DebugBreak()
(和IsDebuggerPresent()
),这是assert
失败时可能发生的选项之一。
在MacOS上有类似的API调用(Debugger()
或SysBreak()
)。
我对Linux知之甚少,但AFAIK在Linux上失败的断言会产生一个coredump,可以在调试器中查看。
答案 2 :(得分:1)
在Linux上,基本上当发生可怕的事情时,你的程序会收到一个signal,如果你没有“掩盖”这个信号,程序会有一个默认的行为,但你通常可以“屏蔽”它来做别的东西,比如打开gdb。你可以从here找到如何掩盖和更多内容,特别是here。
关于断言,您可以轻松创建自己的断言版本,以执行您想要的任何操作。
答案 3 :(得分:1)
不幸的是,我的回复只延伸到了Windows,但Linux也可以通过某种方式向调试器发出信号。
安装了Visual Studio的任何计算机都应启用Just in Time调试。这实质上意味着当进程遇到致命异常时,调试器不必运行。
Just in Time通过注册表项启用调试。有关其他详细信息,请查看上面的链接。
如果您希望捕获进程快照,以便稍后查看,那么通常通过Adplus.vbs(有人参加)或DebugDiag(无人参与)来完成。 Adplus可通过Debugging Toolkit for Windows获得,但DebugDiag是单独下载。
答案 4 :(得分:0)
除了gnud建议的ulimit之外,使用崩溃记者可能是个好主意:http://code.google.com/p/google-breakpad/w/list
答案 5 :(得分:0)
我已经实现了https://github.com/l29ah/waitgdb中的LD_PRELOAD
可用库这样的功能
基本上,它处理值得调试的信号并停止发送信号SIGSTOP
的过程,因此您以后可以附加调试器。