__ debugbreak()语句将导致BSOD。 我想知道为什么吗?
我正在考虑DUT和调试器交换一些工件。.
答案 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应用程序禁用此行为