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

C++ 如何从堆栈中找到代码的崩溃行?,c++,windows,exception,mfc,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

现在我有了坠机信息:

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


任何人都可以帮助我吗?

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

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


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

生成一个映射文件并使用它……它应该会让你的生活变得更轻松,因为你将能够识别堆栈中的特定函数地址……从这样的报告中跟踪一个bug是一项艰巨的工作,但很值得学习这项技术。。。