我在WinDbg中调试exe(x86),因为它在我的电脑上崩溃,开发者不提供支持,而且它是封闭的源码。WinDbg单步异常不会触发
到目前为止,我发现它崩溃,因为空指针传递给ntdll!RtlEnterCriticalSection
。
我试图找到该空指针的来源,我已经达到了一个点(我的“当前点”),我绝对不知道它从哪里被调用。我尝试搜索堆栈中最后几个地址的区域,但没有任何调用,跳转或返回。
我唯一拥有的是在崩溃之前加载的最后一个dll,它显然在我现在的点之前也很长(至少有几千条指令)。
我不能只设置几千个断点,所以我认为单步异常可能有帮助(我可以至少在每条指令上打印eip
,我不关心这是否需要几天)。
但我不能让CPU发起异常!加载的exe后,我进入调试器中的以下内容:
sxe ld:<dll name>
g
sxe sse
sxe wos
r tf=1
g
的中断调试的加载的DLL,我也想,但第二g
后,程序只是击中了之前运行几秒钟碰撞点,根本不会引发任何单步异常。
如果我在没有前两行的情况下执行相同操作(所以我处于程序的起始点),它就可以工作。我知道每次发射SSE时tf
都设置为零,但为什么在程序的后面不会触发?
我错过了什么吗?或者有没有其他方法可以找到该空指针的来源?
你有没有尝试kv命令来列出堆栈和参数,当它崩溃? –
@KjellGunnar当然,但是由于它打印了一些地址和符号,它还向我提供警告:警告:堆栈展开信息不可用。以下帧可能是错误的。“我一直在使用'kd'。 – Siguza
你的目标是什么?调查第三方代码中没有符号和源代码的bug是徒劳的。即使您发现问题,您也无法对其进行有意义的修复。我的建议是在WinDbg中使用命令'.dump -ma'创建崩溃转储并将其发送给产品所有者。崩溃转储应该足以让他们找到并解决问题。 –