所以我写了这个相对较大(~6000 LOC)的Qt应用程序,我在Windows 7中使用它,我得到了这些奇怪的分段错误。大部分时间一切都按照我的预期运行,但有时候,我在ole32.dll中遇到分段错误,这是Windows的一部分。反汇编看起来像这样:
Function: ole32!CoAddRefServerProcess
0x7601c98a <+0x02e3> or %cl,0x37890446(%ecx)
0x7601c990 <+0x02e9> call 0x760326a6 <ole32!ObjectStublessClient15+2849>
0x7601c995 <+0x02ee> xor %eax,%eax
0x7601c997 <+0x02f0> pop %esi
0x7601c998 <+0x02f1> pop %edi
0x7601c999 <+0x02f2> pop %ebx
0x7601c99a <+0x02f3> pop %ebp
0x7601c99b <+0x02f4> ret $0x4
0x7601c99e <+0x02f7> mov (%eax),%ecx
0x7601c9a0 <+0x02f9> push %eax
0x7601c9a1 <+0x02fa> call *0x8(%ecx)
0x7601c9a4 <+0x02fd> jmp 0x7604a6d9 <ole32!CoRevokeClassObject+16608>
0x7601c9a9 <+0x0302> test $0x2000000,%eax
0x7601c9ae <+0x0307> jne 0x76025dc1 <ole32!StgOpenStorage+5555>
0x7601c9b4 <+0x030d> jmp 0x7604a715 <ole32!CoRevokeClassObject+16668>
故障总是发生在同一个地方的同一个dll函数中(第一个mov命令)。当故障发生时,应用程序中没有特定的时间或地点,但是当程序收集或保存数据时它更有可能发生(当它什么都不做时似乎很稳定 - 我让它在没有运行的情况下运行过夜而没有崩溃)。
我对此感到困惑,因为分段发生在一段我没写过的代码中,即使Windows中的错误并非闻所未闻,我想我的程序更有可能搞砸了这个dll使用的内存,从而导致问题。任何人都可以建议如何找到真正导致问题的代码吗?