Exception WinDbg单步异常未触发

Exception WinDbg单步异常未触发,exception,windbg,breakpoints,Exception,Windbg,Breakpoints,我正在调试WinDbg中的一个exe(x86),因为它正在我的计算机上崩溃,开发人员不提供支持,而且它是封闭源代码 到目前为止,我发现它崩溃是因为一个空指针被传递到ntdll!RtlEnterCriticalSection 我试图找到空指针的来源,但我已经到达了一个点(我的“当前点”),我完全不知道它是从哪里调用的。我尝试搜索堆栈上最后几个地址的区域,但根本没有调用、跳转或返回 我唯一拥有的是崩溃前加载的最后一个dll,它显然也比我当前的点长(至少几千条指令) 我不能只设置几千个断点,所以我认为

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

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

我试图找到空指针的来源,但我已经到达了一个点(我的“当前点”),我完全不知道它是从哪里调用的。我尝试搜索堆栈上最后几个地址的区域,但根本没有调用、跳转或返回

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

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

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

sxe ld:<dll name>
g
sxe sse
sxe wos
r tf=1
g
sxe-ld:
G
上海证券交易所
sxe wos
r tf=1
G
调试器在我希望加载的dll中中断,但在第二次
g
之后,程序只运行几秒钟,然后到达崩溃点,根本不会引发任何单步异常

如果我在没有前两行的情况下做同样的事情(因此我是程序的起点),它就可以工作了。我知道每次启动SSE时,
tf
都被设置为零,但为什么它在程序中不启动呢


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

g
不是单步执行的命令,它意味着“go”,只在断点或异常处中断

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


以上只回答了问题的原貌。公开的问题是,正如评论中已经指出的,您将如何减轻该bug?您不能简单地创建一个新的关键部分,也不知道应该在该位置使用哪个现有的关键部分。

g
不是单步执行的命令,它意味着“执行”,并且只在断点或异常处中断

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


以上只回答了问题的原貌。公开的问题是,正如评论中已经指出的,您将如何减轻该bug?您不能简单地创建一个新的关键部分,也不知道应该在该位置使用哪个现有的关键部分。

g
不是单步执行的命令,它意味着“执行”,并且只在断点或异常处中断

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


以上只回答了问题的原貌。公开的问题是,正如评论中已经指出的,您将如何减轻该bug?您不能简单地创建一个新的关键部分,也不知道应该在该位置使用哪个现有的关键部分。

g
不是单步执行的命令,它意味着“执行”,并且只在断点或异常处中断

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


以上只回答了问题的原貌。公开的问题是,正如评论中已经指出的,您将如何减轻该bug?您不能简单地创建一个新的临界区,也不知道应该在该位置使用哪个现有临界区。

您是否尝试过kv命令在崩溃时列出堆栈和参数?@KjellGunnar当然可以,但当它打印一些地址和符号时,它还向我提供了警告
警告:堆栈展开信息不可用。下面的框架可能是错误的。
从那以后我一直在使用
kd
。你的目标是什么?调查没有符号和源代码的第三方代码中的bug是徒劳的。即使您发现了问题,您也无法为其编写有意义的修复程序。我的建议是使用WinDbg中的命令
.dump-ma
创建一个崩溃转储,并将其发送给产品所有者。崩溃转储应该足以让他们发现并解决问题。嗯,我想你是对的。明天会这样做,希望开发者足够关心。但这仍然不能解释为什么单步异常没有触发,我有点想知道,因为我很好奇……很可能(我在这里假设)是命令
g
自动设置
tf=0
,因为它意味着继续执行程序直到下一个断点。这就是命令
t
的作用——它在当前线程上下文中设置
tf=1
。您是否尝试过kv命令在崩溃时列出堆栈和参数?@KjellGunnar当然,但当它打印一些地址和符号时,它还向我提供了警告