等待调试器崩溃?

时间:2009-09-23 11:07:11

标签: c++ debugging segmentation-fault assert

当断言失败或存在分段错误时,发生以下情况之一将非常方便:

  • 程序询问是否运行调试程序。
  • 程序等待崩溃,直到连接调试器。
  • 程序会留下一些东西(核心转储?),我们可以从这一点开始重新执行并进行调查。

由于各种平台,语言和调试器,问题非常普遍。 我问的是C ++,我猜Windows(VS),Linux(gdb),Mac(gdb?)解决方案对社区最有用。我对Linux + gdb感兴趣。

6 个答案:

答案 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的过程,因此您以后可以附加调试器。