C++ GDB核心回溯伪地址

C++ GDB核心回溯伪地址,c++,gdb,g++,core,backtrace,C++,Gdb,G++,Core,Backtrace,当我使用带有-o2标志的g++编译相同的代码时,我可以成功地回溯,而不需要任何虚假地址。喜欢 0x08156079 in CItem::GetValue (this=0x3adb0f00, idx=0) at item.cpp:957 0x081b123c in quest::item_has_flag (L=0x3af9bdc0) at questlua_item.cpp:155 0x08363cba in luaD_precall (L=0x3af9bdc0, func=0x3b1cedd8

当我使用带有-o2标志的g++编译相同的代码时,我可以成功地回溯,而不需要任何虚假地址。喜欢

0x08156079 in CItem::GetValue (this=0x3adb0f00, idx=0) at item.cpp:957
0x081b123c in quest::item_has_flag (L=0x3af9bdc0) at questlua_item.cpp:155
0x08363cba in luaD_precall (L=0x3af9bdc0, func=0x3b1cedd8) at ldo.c:249
0x0836ba86 in luaV_execute (L=0x3af9bdc0) at lvm.c:637
0x08363fad in resume (L=0x3af9bdc0, ud=0xffffa164) at ldo.c:337
0x0836393b in luaD_protectedparser (L=0x3af9bdc0, z=0x8363f80, bin=-24220)
....
但是为了更好的性能和其他原因,我需要使用g++48(与c++11一起使用)。。。所以,当我用-o3优化标志和g++48做同样的事情时,我不能得到任何文件名,比如

#0  0x28a56f3c in ?? ()
No symbol table info available.
#1  0x00000032 in ?? ()
No symbol table info available.
#2  0xbfbf9838 in ?? ()
No symbol table info available.
#3  0x28a4ea3a in ?? ()
No symbol table info available.
#4  0x00000032 in ?? ()
No symbol table info available.
#5  0x00000004 in ?? ()
No symbol table info available.
#6  0x00000001 in ?? ()
No symbol table info available.
#7  0x28a70694 in ?? ()
No symbol table info available.
#8  0xbfbf969c in ?? ()
No symbol table info available.
#9  0x28a6b06c in ?? ()
No symbol table info available.

哪些标志不能用于调试?(-fno省略帧指针)我应该使用哪些标志进行调试?还有原因。。。我不是一个专家。

对于GCC4.8,您可以使用-Og开关来启用所有不干扰调试的优化


还要确保启用了调试信息(-g开关)。如果将编译器更新为较新版本,则还应更新调试器。您可以尝试的另一件事是确保gcc以兼容的格式生成调试信息(try-gdwarf-2或类似格式)。

使用-O0编码,直到行为正确为止。GDB将工作得更好。然后考虑优化。如果您的性能不足,您可能应该搜索更好的算法。在Ubuntu12.04上,我一直在使用“-gstabs+”。我尝试了-O0,结果是一样的,我看不清楚。为什么会发生这种情况。我不认识“无符号表信息”(尽管我见过类似的情况)。如果您还尝试了“-gstabs+”选项(在所有编译单元上),但没有成功,那么还有许多其他调试选项。最简单的是-g,其他包括-gcoff、-ggdb、-gstabs、-gstrict-dwarf、-gxcoff。请参阅man g++,调试选项。不要在使用
-O
编译的二进制文件上使用
gdb
,而不使用
-g
(最多使用
-Og
优化调试的二进制文件,最好不使用它)首先,您需要最新的gdb。您使用的是哪个版本?gcc的哪个版本?您使用的是哪个操作系统?
-Og
应与
-g