gdb堆栈奇怪

时间:2010-12-23 20:26:11

标签: gdb stack

我得到这个奇怪的回溯(有时):

(gdb) bt
#0  0x00002b36465a5d4c in AY16_Loop_M16 () from /opt/intel/mkl/10.0.3.020/lib/em64t/libmkl_mc.so
#1  0x00000000000021da in ?? ()
#2  0x00000000000021da in ?? ()
#3  0xbf3e9dec2f04aeff in ?? ()
#4  0xbf480541bd29306a in ?? ()
#5  0xbf3e6017955273e8 in ?? ()
#6  0xbf442b937c2c1f37 in ?? ()
#7  0x3f5580165832d744 in ?? ()
...

为什么我看不到符号的任何想法?当然是用调试syms编译的。 同一个会话在其他点给出了符号。

2 个答案:

答案 0 :(得分:3)

AY16_Loop_M16()中的libmkl_mc.so最有可能是在汇编中编写的,并且没有正确的展开描述符,这是GDB在x86_64上正确展开堆栈所需的(在没有帧指针的情况下)。

您最好的选择是联系英特尔,并要求他们添加适当的展开描述符。

如果在AY16_Loop_M16的开头设置断点,如果从C(或任何其他非汇编语言)调用断点,则可能会得到更好的结果,您可能会获得合理的堆栈跟踪进入。

答案 1 :(得分:0)

虽然您的代码可能使用调试符号进行编译,但共享库的情况可能并非如此。您可能需要安装这些库的调试版本才能获得这些符号。

您仍然可以使用GDB调试自己的代码。只需忽略未知位置,并在回溯中查找自己的函数调用。无论如何,问题不在共享库中,这很好。