__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 应用程序禁用此行为
__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 应用程序禁用此行为