如何在优化的程序中调试崩溃

时间:2014-08-14 13:31:01

标签: debugging gcc optimization

我正在尝试调试仅在某些cpu上出现的崩溃,并且仅在使用gcc optmiziation on(-03)进行编译时,它不会发生在-O0上。两个编译都使用-g

我嵌入了博士。 mingw在应用程序中因为崩溃发生在PC上而不是我的。 我收到了以下崩溃报告:

Error occured on Thursday, August 14, 2014 at 12:07:08.



C:\Users\Schüle\Arena\Engines\Vajolet\vajolettestc\vajolet2c.exe caused an Access Violation at location 0040C826 in module C:\Users\Schüle\Arena\Engines\Vajolet\vajolettestc\vajolet2c.exe Writing to location 023C8000.



Registers:

eax=000036b3 ebx=0299d130 ecx=00df885d edx=023ba528 esi=be220226 edi=023b9178

eip=0040c826 esp=0299cf30 ebp=0299fe78 iopl=0         nv up ei ng nz ac po cy

cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010297



AddrPC   Params

0040C826 0299FEC0 00DFAFE0 00DFAFE0  vajolet2c.exe-------------------



Error occured on Thursday, August 14, 2014 at 13:24:32.



C:\Users\Schüle\Arena\Engines\Vajolet\vajolettestc\vajolet2c.exe caused an Access Violation at location 0040C826 in module C:\Users\Schüle\Arena\Engines\Vajolet\vajolettestc\vajolet2c.exe Writing to location 00C68000.



Registers:

eax=00002dad ebx=02bfd130 ecx=00b5887d edx=00c5c940 esi=bfffffff edi=00c5b8d8

eip=0040c826 esp=02bfcf30 ebp=02bffe78 iopl=0         nv up ei ng nz na po cy

cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010287



AddrPC   Params

0040C826 02BFFEC0 00B5AFE0 00B5AFE0  vajolet2c.exe

如果我没有错,程序会在地址0x0040C826与程序计数器一起崩溃。

我创建了一个文件映射,将程序链接到链接器选项“-Wl,-Map,prog.map”a

在地图文件中我找到了这一行:

.....
.text    0x0040a130   0x48f0 search.o
         0x0040a140        search::printPV(
         0x0040a720        search::printAllPV(
         0x0040bac0        search::StartThinking(
.text    0x0040ea20  0x8940 position.0
.....

所以我认为问题出在StartThinking函数中。

如何从gcc获取更多信息?我可以创建一个与代码混合的反汇编吗?

谢谢

1 个答案:

答案 0 :(得分:2)

在互联网上搜索后,我发现我可以使用选项-Wa,-adhln创建一个asm混合到c代码的asm文件。

之后我通过0x0040c826-0x0040a130计算了在asm文件中搜索的偏移量,我发现了错误的指令。

sam文件指向错误的c ++行!!