__debugbreak() 未连接 windbg

__debugbreak() without connecting windbg

如果未连接 WinDbg,则 KMD 中的

__debugbreak() 语句会导致 BSOD。 我想知道为什么?

我认为 DUT 和调试器交换了一些工件..?

__debugbreak 内在函数引发断点异常。 (int 3 在 x86 系统上)

没有调试器,这将无法处理,这将导致错误检查。

如果您想检测内核调试器的存在,KD_DEBUGGER_NOT_PRESENT 变量可能对您有用。

KD_DEBUGGER_NOT_PRESENT 并不总是最新的,但可以使用 KdRefreshDebuggerNotPresent().

刷新

您可能需要这样的东西:

void BreakIfDebuggerPresent()
{
    if (!KdRefreshDebuggerNotPresent()) {
        DbgBreakPoint();
    }
}

__debugbreak intrisic 或 DebugBreakPoint api 都引发 int 3 异常

如果您在用户模式下拥有它并且未经处理,应用程序会崩溃

如果它处于内核模式并且未处理 os 崩溃

这是记录在案的行为

https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/nf-wdm-dbgbreakpoint

yif 它是用户模式并且存在内核模式调试器,默认情况下将异常路由到内核调试器而不是使应用程序崩溃

您 csn 通过在 windbg 安装中使用 kdbgctrl 应用程序禁用此行为