- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试编写一个程序来根据良好的实现测试学生代码。我有一个 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/
我正在使用 DLLImport 导入硬件公司提供的库,并在 .NET Framework 中编写代码以使用 DLL 提供的 API。 在其中一种方法中,当触发时,Visual Studio 返回“断点
我已经在 Windows 上使用 __debugbreak() 编写了一些代码,我想支持其他编译器,所以我希望创建此函数的更便携版本(Clang 和海合会)。 我暂时拒绝使用内联汇编程序,因为它不提供
我正在使用openGL的最新glDebugMessageCallback约定来帮助我处理openGL错误。我想要做的是有一种方法来查看导致openGL错误的函数。我认为使用回调方法的唯一方法是在我的回
在 MSVC 中,DebugBreak()或 __debugbreak导致调试器中断。在 x86 上它相当于写“_asm int 3”,在 x64 上它是不同的。使用 gcc(或任何其他标准编译器)编
我正在使用在某些情况下运行 __debugbreak() 的第 3 方 C++ DLL,并且在这样做之前没有检查 IsDebuggerPresent()。当这种情况发生在调试器之外(例如,最终用户运行
在 Windows 上,我的断言宏基本上如下所示: #define MYASSERT(condition) (if (!(condition)) { ReportFailture( #conditio
我正在尝试编写一个程序来根据良好的实现测试学生代码。我有一个 C++ 控制台应用程序,它将在由命令行参数确定的时间运行一个测试,还有一个 C# .net 表单应用程序,它为每个测试调用一次 C++ 应
我正在尝试实现自定义 Assets 宏(类似于 assert.h 的内容),但我希望能够在获取并断言后继续执行。 例如,一个这样的 ASSERT 实现可以是: #define ASSERT(expr)
我是一名优秀的程序员,十分优秀!