__debugbreak()不连接windbg

时间:2018-07-11 13:47:51

标签: debugging windbg remote-debugging

如果未连接WinDbg,则KMD中的

__ debugbreak()语句将导致BSOD。 我想知道为什么吗?

我正在考虑DUT和调试器交换一些工件。.

2 个答案:

答案 0 :(得分:2)

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

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

如果您想检测是否存在内核调试器,则可以使用KD_DEBUGGER_NOT_PRESENT变量。

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

您可能需要这样的东西:

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

答案 1 :(得分:0)

__ debugbreak内部或DebugBreakPoint api都引发一个int 3异常

如果它处于用户模式且未处理,则应用程序崩溃

如果它处于内核模式并且未处理,则操作系统崩溃

已记录为行为

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

如果是usermode且存在内核模式调试器,则默认情况下会将异常路由到内核调试器,而不是使应用程序崩溃

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