如何从堆栈中找到崩溃的代码行?

时间:2012-10-14 16:48:35

标签: c++ windows exception mfc

现在我有崩溃信息:

TestAPP导致访问冲突(0xc0000005) 在模块XCrashReportTest.exe中,电话0023:5763c230。

Context:
EDI:    0x002aee0c  ESI: 0x002ad7f4  EAX:   0x00000000
EBX:    0x00000000  ECX: 0x57635670  EDX:   0x028c1d27
EIP:    0x5763c230  EBP: 0x002aee18  SegCs: 0x00000023
EFlags: 0x00010246  ESP: 0x002ad554  SegSs: 0x0000002b

Bytes at CS:EIP:                                                 
8b 08 52 50 8b 41 18 ff d0 8b 0d c8 e0 66 57 8b                  

Stack:                                                           
0x002ad554: 576504f7 002aee0c 002ad7f4 002ad570 ..eW..*...*.p.*. 
0x002ad564: 002aee0c 5763c201 002aee18 002ad59c ..*...cW..*...*. 
0x002ad574: 576490b1 5763c201 002aee0c 00000100 ..dW..cW..*..... 
0x002ad584: 002ad5f4 57648d9f 75785eaa 57668e70 ..*...dW.^xup.fW 
0x002ad594: 002aee0c 00000001 002ad604 5764d4d2 ..*.......*...dW 
0x002ad5a4: 002aee0c 57668e70 5763c201 00000000 ..*.p.fW..cW.... 
0x002ad5b4: 00000100 75785d2a 57668e5c 002aee0c ....*]xu\.fW..*. 
0x002ad5c4: 57668e4c 002add84 00000000 00000000 L.fW..*.........

我指的是XCrashReport [XCrashReport:异常处理和崩溃报告 - 第1部分

但我发现,当我在同一台机器上运行相同的* .exe时,EIP有时会有所不同。因此,有时我无法将崩溃代码行与EIP(XCrashReport中描述的方法:异常处理和崩溃报告 - 第1部分)相匹配。我不知道如何使用堆栈信息。

任何人都可以帮助我?

1 个答案:

答案 0 :(得分:3)

这样做的唯一合理方法是将崩溃转储加载到调试器中并提供符号,即.pdb文件。这可能很棘手,因为pdb文件可能没有足够的信息。像Microsoft这样的公司提供公共PDB文件,这些文件没有关于本地变量名称和其他详细信息的信息。具有完整信息的PDB称为公共PDB。

有时堆栈会被破坏,导致“失去控制”。代码获取返回地址,即一些垃圾,将此值加载到EIP并从那里开始执行指令。在这种情况下,在执行了几条“指令”后,崩溃很快就会发生。

我的意思是你需要弄清楚你的EIP是否首先指向任何代码。