Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带着崩溃等待调试器?_C++_Debugging_Segmentation Fault_Assert - Fatal编程技术网

C++ 带着崩溃等待调试器?

C++ 带着崩溃等待调试器?,c++,debugging,segmentation-fault,assert,C++,Debugging,Segmentation Fault,Assert,当断言失败或存在分段错误时,很容易发生以下情况之一: 程序询问是否运行调试器 程序等待崩溃,直到附加了调试器 程序留下了一些东西(核心转储?),我们可以从这一点开始恢复执行并进行调查 由于平台、语言和调试器的多样性,这个问题相当普遍。 我问的是C++,我想Windows(VS)、Linux(GDB)、MAC(GDB)解决方案对社区最有用。我对Linux+gdb感兴趣。在Windows上有DebugBreak()(和IsDebuggerPresent()),这是断言失败时可能发生的情况的选项之

当断言失败或存在分段错误时,很容易发生以下情况之一:

  • 程序询问是否运行调试器
  • 程序等待崩溃,直到附加了调试器
  • 程序留下了一些东西(核心转储?),我们可以从这一点开始恢复执行并进行调查
由于平台、语言和调试器的多样性,这个问题相当普遍。
我问的是C++,我想Windows(VS)、Linux(GDB)、MAC(GDB)解决方案对社区最有用。我对Linux+gdb感兴趣。

在Windows上有
DebugBreak()
(和
IsDebuggerPresent()
),这是
断言失败时可能发生的情况的选项之一

在MacOS上有类似的API调用(
Debugger()
SysBreak()


我对Linux了解不多,但如果在Linux上断言失败,将导致coredump,可以在调试器中查看

在Linux上,基本上当一些可怕的事情发生时,您的程序会收到一条消息,如果您不“屏蔽”这个信号,程序会有一个默认行为,但您通常可以“屏蔽”它以执行其他操作,例如打开gdb。你可以从中找到如何遮罩以及更多,特别是

关于assert,您可以轻松创建自己的assert版本,做任何您想做的事情。

在Linux(可能还有OSX和其他unixen)上,您可以允许程序使用
ulimit
实用程序离开coredump


这里有一个简短的说明。

不幸的是,我的回答只适用于Windows,但Linux也可以用某种方式向调试器发送信号

任何安装了Visual Studio的计算机都应启用调试。这本质上意味着当进程遇到致命异常时,调试器不必运行

通过注册表项启用即时调试。查看上面的链接了解更多详细信息


如果您希望捕获一个流程快照以供以后查看,那么这通常是通过Adplus.vbs(有人参与)或DebugDiag(无人参与)完成的。Adplus可以通过下载,但是单独下载的。

除了gnud建议的ulimit之外,使用崩溃报告器可能是个好主意:

我在


基本上,它处理有调试价值的信号并停止发送它的进程
SIGSTOP
,以便您以后可以附加调试器。

int 3
是要中断调试器的通用汇编指令,也是您命名的函数在内部调用的指令。如果说“universal”,是指导致中断的x86指令,当然可以;)IIRC,默认设置之一是核心转储。