WinDbg 单步异常未触发

WinDbg single step exception not firing

我正在 WinDbg 中调试一个 exe (x86),因为它在我的计算机上崩溃,开发人员不提供支持并且它是封闭源代码。

到目前为止我发现它崩溃是因为空指针被传递给 ntdll!RtlEnterCriticalSection

我试图找到那个空指针的来源,但我已经到了一个地步(我的 "current point"),我完全不知道它是从哪里调用的。我尝试搜索堆栈中最后几个地址的区域,但那里根本没有调用、跳转或 returns。

我唯一拥有的是崩溃前加载的最后一个 dll,显然在我当前点之前也很长(至少几千条指令)。

我不能只设置几千个断点,所以我认为单步异常会有所帮助(我至少可以在每条指令上打印 eip,我不在乎这是否需要几天时间).

但我无法让 CPU 触发异常!加载exe后,我在调试器中输入以下内容:

sxe ld:<dll name>
g
sxe sse
sxe wos
r tf=1
g

调试器在我想要的地方为加载的 dll 中断,但在第二个 g 之后,程序在到达崩溃点之前只运行了几秒钟,根本没有引发任何单步异常.

如果我在没有前两行的情况下做同样的事情(所以我在程序的起点),它就可以工作。我知道每次触发 SSE 时 tf 都设置为零,但为什么它在程序的后面根本不触发?

我错过了什么吗?或者有没有其他方法可以找到那个空指针的来源?

g不是单步执行的命令,它的意思是"go",只在断点或异常处中断。

要进行单步执行,请使用 p。由于您没有源代码,因此无法在源代码级别进行指令步进,这意味着您必须在汇编级别进行。 (汇编指令步进应该是默认的,它不会用 l-t 启用它。)这需要时间,具体取决于你需要走多远。

以上仅按原样回答了问题。悬而未决的问题是,就像评论中已经指出的那样,您将如何缓解该错误?您不能简单地创建一个新的临界区,也不知道应该在那个地方使用哪个现有的临界区。