【问题标题】:__debugbreak() without connecting windbg__debugbreak() 不连接windbg
【发布时间】:2018-07-11 13:47:50
【问题描述】:
如果未连接 WinDbg,则 KMD 中的

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

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

【问题讨论】:

  • 我建议您更具体一些。事实上,这个问题真的很难回答。

标签: debugging windbg remote-debugging


【解决方案1】:

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

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

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

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

你可能需要这样的东西:

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

【讨论】:

    【解决方案2】:

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

    如果你有它在用户模式,它是未处理的应用程序崩溃

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

    这是记录在案的行为

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

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

    您可以在 windbg 安装中使用 kdbgctrl 应用程序禁用此行为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2016-01-05
      • 2022-06-29
      • 2015-07-14
      • 1970-01-01
      • 2018-01-08
      相关资源
      最近更新 更多