c# - Process.WaitForExit 不使用 __debugbreak 触发

标签 c# .net c++ debugging

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

问题是并非所有错误都会终止 C++ 应用程序。如果它们破坏了堆,系统调用 __debugbreak 弹出一个窗口,提示调试错误!检测到堆损坏...我的 C# 应用程序正在使用 Process.WaitForExit(5000) 等待,但此错误不算作退出,所以我看到了超时。

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

编辑:
这是弹出的错误:Debug Error

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

最佳答案

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

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

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

// AssertModify.cpp
class AssertModify
{
public:
    AssertModify()
    {
        ::_CrtSetReportMode(...);
        ::_CrtSetReportFile(...);
    }
};

AssertModify am;

这将导致代码在输入 main() 之前运行,这应该捕获所有可能的情况(除非学生自己覆盖您的值,但您可以添加对任何调用的检查 _CrtSetReportMode 在你编译之前在他们提交的代码中)

关于c# - Process.WaitForExit 不使用 __debugbreak 触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2535218/

相关文章:

c# - 如果中间有外部 api 调用,如何处理 lock 语句

c# - 在 LINQ OrderBY 中排除一个值

c# - 为什么 List.BinarySearch() 除了 IComparer<T> 之外没有采用 Comparison<T> 的重载?

c++ - 如何检测 C++ 字符串中的 "_"?

c# - DataTable 上的表达式树

C# - 套接字未接收所有字节

c# - 使用 Automapper 基于内置数据类型创建对象

c# - 在C#中查找内存泄漏

c++ - 我们可以在 C 文件中定义 C++ 方法吗?

C++ Win 异步套接字。是否可以中断 select()