【问题标题】:How can I find the crash line of code from stack?如何从堆栈中找到代码的崩溃行?
【发布时间】:2012-10-04 18:18:05
【问题描述】:

现在我有了崩溃信息:

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

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 部分。我不知道如何使用堆栈信息。

谁能帮帮我?

【问题讨论】:

  • 生成一个映射文件并使用它......它应该开始让你的生活更轻松,因为你将能够识别堆栈中的特定函数地址......它很难从一个像这样的报告,但非常值得学习艺术......

标签: c++ windows exception mfc


【解决方案1】:

执行此操作的唯一一种合理方法是将故障转储加载到调试器中并提供符号,即 .pdb 文件。这可能很棘手,因为 pdb 文件可能没有足够的信息。像微软这样的公司提供的公共 PDB 文件不包含有关本地变量名称和其他详细信息的信息。具有完整信息的 PDB 称为公共 PDB。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2023-02-03
    相关资源
    最近更新 更多