突入调试器
用户模式和内核模式代码使用不同的例程进入调试器。
用户模式中断例程
中断例程会导致当前进程中发生异常,以便调用线程可以向与调用进程关联的调试器发出信号。
若要从用户模式程序进入调试器,请使用 DebugBreak 函数。 其原型如下:
VOID DebugBreak(VOID);
当用户模式程序调用 DebugBreak 时,将发生以下可能的操作:
如果附加了用户模式调试器,程序将进入调试器。 这意味着程序将暂停,调试器将激活。
如果未附加用户模式调试器,但在启动时启用了内核模式调试,则整个计算机将进入内核调试器。 如果未附加内核调试器,计算机将冻结并等待内核调试器。
如果未附加用户模式调试器,且未启用内核模式调试,程序将终止并出现未经处理的异常,事后分析(实时)调试器将会激活。 有关详细信息,请参阅启用调事后调试。
内核模式中断例程
当内核模式程序进入调试器时,整个操作系统将冻结,直到内核调试器允许执行恢复为止。 如果不存在内核调试器,则会将其视为 Bug 检查。
DbgBreakPoint 例程在内核模式代码中工作,但与其他 DebugBreak用户模式例程类似。
DbgBreakPointWithStatus 例程也会导致中断,但它还会向调试器发送 32 位状态代码。
在检查生成环境中编译时,KdBreakPoint 和 KdBreakPointWithStatus 例程分别与 DbgBreakPoint 和 DbgBreakPointWithStatus 相同。 在免费生成环境中编译时,它们不起作用。
内核模式条件中断例程
两个条件中断例程可用于内核模式代码。 这些例程测试逻辑表达式。 如果表达式为 false,则执行将停止,调试器变为活动状态。
ASSERT 宏测试逻辑表达式。 如果表达式为 false,则执行将停止,调试器变为活动状态。 调试器中会显示失败的表达式及其在程序中的位置。
ASSERTMSG 宏与 ASSERT 相同,只不过它允许向调试器发送其他消息。
ASSERT 和 ASSERTMSG 仅在检查生成环境中编译时处于活动状态。 在免费生成环境中编译时,它们不起作用。