Process.WaitForExit不会触发__debugbreak

时间:2010-03-29 00:39:25

标签: c# .net c++ debugging

我正在尝试编写一个程序来测试学生代码以防止良好的实现。我有一个C ++控制台应用程序,它将在命令行args和C#.net表单应用程序确定的时间运行一个测试,该应用程序为每个测试调用一次c ++应用程序。目标是不仅能够检测每次测试的通过/失败,还能检测“无限”(> 5secs)循环和异常(他们的代码因任何原因而死亡)。

问题是并非所有错误都会导致C ++应用程序崩溃。如果它们破坏了堆,则系统调用__debugbreak,弹出一个窗口,说明调试错误! HEAP CORRUPTION DETECTED ...我的C#app使用Process.WaitForExit(5000)等待,但是这个错误不算作退出,所以我看到超时。

所以我的问题是,如何让C#应用程序检测到这是一个错误或者如何在发生此错误时让C ++应用程序死掉,而不是给出一个对话框并询问我是否要调试?

修改:
这是弹出的错误:Debug Error

如果我在上一个对话框中按重试,则弹出正常的应用程序失败对话框:Windows Error。如果关闭JIT调试器,调试选项就会消失。

2 个答案:

答案 0 :(得分:1)

您应该关闭JIT调试,this page有关于如何打开或关闭它的说明。

编辑您还可以使用C ++程序中的_CrtSetReportMode_CrtSetReportFile函数来更改调试断言的行为(特别是,您可以使用{{1将消息内容写入文件而不是弹出对话框。

如果您正在编译程序作为测试的一部分,那么您可以添加自己的.cpp文件,其中包含一个在其构造函数中完成工作的全局类。像这样:

_CRTDBG_MODE_FILE

这会导致代码在输入// AssertModify.cpp class AssertModify { public: AssertModify() { ::_CrtSetReportMode(...); ::_CrtSetReportFile(...); } }; AssertModify am; 之前运行,这应该捕获所有可能的情况(除非学生自己覆盖您的值,但您可以添加对main()的任何调用的检查他们在编译之前提交的代码)

答案 1 :(得分:0)

我认为你需要在“发布”模式下编译C ++应用程序。您可能正在运行包含断言的“调试”构建。那些断言会弹出MessageBoxes,这就是你所看到的。

由于您想要捕获断言失败,您可以在编译时修改代码(如codeka建议的那样)或在调试器下运行程序。使用Mike Stall's wrapper将C#应用程序编入调试器并不难,但它并不是最简单的解决方案。