2015-01-17 36 views
0

我在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都设置为零,但为什么在程序的后面不会触发?

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

+0

你有没有尝试kv命令来列出堆栈和参数,当它崩溃? –

+0

@KjellGunnar当然,但是由于它打印了一些地址和符号,它还向我提供警告:警告:堆栈展开信息不可用。以下帧可能是错误的。“我一直在使用'kd'。 – Siguza

+0

你的目标是什么?调查第三方代码中没有符号和源代码的bug是徒劳的。即使您发现问题,您也无法对其进行有意义的修复。我的建议是在WinDbg中使用命令'.dump -ma'创建崩溃转储并将其发送给产品所有者。崩溃转储应该足以让他们找到并解决问题。 –

回答

3

g不是单步执行的命令,它意味着“执行”并且仅在断点或异常时断开。

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

以上仅回答问题。正如已经在评论中指出的那样,未解决的问题是,你将如何减轻该错误?您不能简单地创建一个新的关键部分,也不知道该地点应该使用哪个关键部分。

+0

由于该程序在大多数计算机上都能正常工作,但在其他一些计算机上崩溃(包括我的),我假设有代码在某处实例化临界区,但是代码简单地失败(或者由于断言失败而跳过)一样)。如果是这样的话,我希望找出究竟是什么导致了这种失败,我怀疑这是一种未记录的软件依赖性还是一种无证的驱动程序/硬件不兼容性。 无论如何,这回答了原来的问题,谢谢。 – Siguza