assert(0)

使用断言,当值为0时,会在stderr中输出Assertion failed,并指示是那一行代码报错,同时会弹出一个“Microsoft Visual C++ Runtime Library”错误,并退出程序。该断言宏只会在debug模式下启用,因为release模式下Visual Studio自动添加了NDEBUG宏定义。

int main(array<System::String^>^ args)
{
    int d = test(1, 2);
    std::cout << d << std::endl;
    assert(0);
    return 0;
}

//stderr输出
Assertion failed: 0, file C:\Users\CNMIZHU7\Source\repos\CPPTest\CPPTest\CPPTest.cpp, line 15

日志文件夹
日志文件夹
日志文件夹

诊断消息的目标

诊断消息的目标取决于调用例程的应用程序的类型。 控制台应用程序通过 stderr 接收消息。 在基于 Windows 的应用程序中,assert 调用 Windows MessageBox 函数创建消息框来显示消息以及三个按钮:“中止”、“重试”和“忽略”。 如果用户选择“中止”,则程序将立即中止。 如果用户选择“重试”,则将调用调试器,之后用户可以调试程序,前提是启用了实时 (JIT) 调试。 如果用户选择“忽略”,程序将继续正常执行。 如果存在错误条件,则单击“忽略”可能导致未定义的行为,因为调用代码的前提条件未满足。

TRACE宏

TRACE宏类似C语言中的Printf函数,用于程序运行过程中,适当输出想要的调试信息。TRACE宏只有在调试状态下才有所输出,所以只对Debug 版本的工程产生作用,而在Release 版本的工程中,TRACE宏将被忽略。而Printf 函数则无限制条件,任何情况均可以进行输出。

JIT (Just-In-Time) 优化和调试

如果尝试调试代码,则在该代码未优化时更易调试。 优化代码时,编译器和运行时会对发出的 CPU 代码进行更改,使其运行速度更快,但与原始源代码的映射不太直接。 如果映射不太直接,则调试器通常无法告诉你局部变量的值,代码步进和断点也可能无法按预期要求工作。

DebugBreak & AfxDebugBreak

在代码中直接调用DebugBreak()函数,可以使程序中断运行,和在IDE中设置断点中断运行的道理是一样的。AfxDebugBreak只在MFC中起作用。

if (msg->msg == NULL) {
	DebugBreak();
}

if (msg->msg == NULL) {
	AfxDebugBreak();
}

OutputDebugString

OutputDebugString是属于windows API的,所以只要是包含了window.h这个头文件后就可以使用了,它可以把调试信息输出到编译器的输出窗口,可以用DbgView这样的工具查看,这样就可以脱离编译器了。

OutputDebugString(L"~CPositionTest()\n");

CString str;
str.Format(L"~CPositionTest(): x=%d, y=%d, z=%d\n", x, y, z);
OutputDebugString(str);