突入调试器

用户模式和内核模式代码使用不同的例程进入调试器。

用户模式中断例程

中断例程会导致当前进程中发生异常,以便调用线程可以向与调用进程关联的调试器发出信号。

若要从用户模式程序进入调试器,请使用 DebugBreak 函数。 其原型如下:

VOID DebugBreak(VOID);

当用户模式程序调用 DebugBreak 时,将发生以下可能的操作:

  1. 如果附加了用户模式调试器,程序将进入调试器。 这意味着程序将暂停,调试器将激活。

  2. 如果未附加用户模式调试器,但在启动时启用了内核模式调试,则整个计算机将进入内核调试器。 如果未附加内核调试器,计算机将冻结并等待内核调试器。

  3. 如果未附加用户模式调试器,且未启用内核模式调试,程序将终止并出现未经处理的异常,事后分析(实时)调试器将会激活。 有关详细信息,请参阅启用调事后调试

内核模式中断例程

当内核模式程序进入调试器时,整个操作系统将冻结,直到内核调试器允许执行恢复为止。 如果不存在内核调试器,则会将其视为 Bug 检查。

DbgBreakPoint 例程在内核模式代码中工作,但与其他 DebugBreak用户模式例程类似。

DbgBreakPointWithStatus 例程也会导致中断,但它还会向调试器发送 32 位状态代码。

在检查生成环境中编译时,KdBreakPoint KdBreakPointWithStatus 例程分别与 DbgBreakPoint DbgBreakPointWithStatus 相同。 在免费生成环境中编译时,它们不起作用。

内核模式条件中断例程

两个条件中断例程可用于内核模式代码。 这些例程测试逻辑表达式。 如果表达式为 false,则执行将停止,调试器变为活动状态。

  • ASSERT 宏测试逻辑表达式。 如果表达式为 false,则执行将停止,调试器变为活动状态。 调试器中会显示失败的表达式及其在程序中的位置。

  • ASSERTMSG 宏与 ASSERT 相同,只不过它允许向调试器发送其他消息。

ASSERTASSERTMSG 仅在检查生成环境中编译时处于活动状态。 在免费生成环境中编译时,它们不起作用。