C++ gdb中未解析的调试符号

C++ gdb中未解析的调试符号,c++,gdb,cross-compiling,C++,Gdb,Cross Compiling,我的一个应用程序在powerpc平台的Montavista linux上运行时崩溃了。顶部3个堆栈帧显示绝对地址,而不是符号。我的构建机器托管在不同的平台上,我正在使用跨编译器构建应用程序。我怎样才能找回这些符号 回溯如下所示- #0 0x0f272adc in ?? () from /lib/libc.so.6 #1 0x0f3537fc in ?? () from /lib/libc.so.6 #2 0x0f274f44 in ?? () from /lib/libc.so.6 #3

我的一个应用程序在powerpc平台的Montavista linux上运行时崩溃了。顶部3个堆栈帧显示绝对地址,而不是符号。我的构建机器托管在不同的平台上,我正在使用跨编译器构建应用程序。我怎样才能找回这些符号

回溯如下所示-

#0  0x0f272adc in ?? () from /lib/libc.so.6
#1  0x0f3537fc in ?? () from /lib/libc.so.6
#2  0x0f274f44 in ?? () from /lib/libc.so.6
#3  0x0f276e94 in malloc () from /lib/libc.so.6
#4  0x105c94a8 in fast_memget (module_id=0, noctets=820, err=0x3893e710) at ../common/src/portlayer.c:1305
#5  0x1055f734 in glbSipParserDecodeMessage (
    message=0x3b225e58 "SIP/2.0 200 OK\r\nVia: SIP/2.0/TCP 10.194.182.55:5060;branch=z9hG4bK2495419925-4086;received=10.194.182.55;ingress-zone=mxenode51\r\nCall-ID: 2469861343-4086\r\nCSeq: 6 INFO\r\nContact: <sip:4084565719@10.194"..., opt=0x3893e70c, messageLength=425, nextmesg=0x3893e898, pContext=0x3893e8cc, ppSipMessage=0x3893e6bc, err=0x3893e710) at src/sipdecode.c:6184
#0 0x0f272adc输入??()来自/lib/libc.so.6
#1 0x0f3537fc英寸??()来自/lib/libc.so.6
#2 0x0f274f44英寸??()来自/lib/libc.so.6
#3/lib/libc.so.6中malloc()中的0x0f276e94
#4 0x105c94a8位于../common/src/portlayer.c:1305的fast_memget(模块id=0,noctes=820,err=0x3893e710)中
#GLBSIPPARSERDEMOSSAGE中的5 0x1055f734(

message=0x3b225e58“SIP/2.0 200 OK\r\nVia:SIP/2.0/TCP 10.194.182.55:5060;branch=z9hG4bK2495419925-4086;received=10.194.182.55;ingress zone=mxenode51\r\n调用ID:2469861343-4086\r\n顺序:6信息\r\n联系:您需要在Debian或派生系统(例如Ubuntu)上安装带有调试信息的C库(libc)这是一个名为
libc6-dbg
的软件包,您需要安装带有调试信息的C库(libc)。在Debian或派生系统(如Ubuntu)上,这是一个名为
libc6-dbg
的软件包。考虑到注释中的额外信息,这里有一些东西需要检查:

应用程序是否使用优化(-O1,-O2等)编译?如果是,请在不使用这些选项的情况下重新编译。我自己在Cavium Octeon(MIPS)上交叉编译时遇到过这种情况,并发现存在优化标志会导致无法看到符号

可能是堆栈被破坏了吗?如果是这样的话,我认为所有的帧都会被破坏。你有没有可能使用Valgrind之类的工具来检查你的内存是否被破坏了?或者至少在Linux上运行应用程序

在进一步讨论之前,您真的需要进一步了解前3帧吗?难道还不知道它在malloc中崩溃了吗?也许您应该考虑一下是什么导致了malloc中的崩溃。在前面提到的同一Cavium平台中,我们遇到了一个问题,即如果我们在没有数据的情况下调用malloc/new,系统会崩溃内存被保留:(即使在通知他们错误后,我们也不得不使用一种黑客破解方法。在调用malloc/new时是否检查NULL?如果从多个不同的位置调用它,这可能会很困难。我们包装了new/malloc,因此这对我们来说很容易做到

在OP提供更多评论后更新

<> P>如果内存不足,它不应该崩溃,而不是由于内存泄漏,但要检查MALLC是否返回空。您还应该考虑使用“内存外处理程序”。
在同一个Cavium平台上,我们遇到了类似的内存损坏问题,很难找到(我们还不能在Linux上使用valgrind运行它)我们找到了一种方法来检查内部内存头的有效性,每次我们都做了一个MALOC。这确实减慢了它的速度,但最终它让我们找到了问题。如果你不能访问这样的东西,或者Linux上的ValGRIND,你可以考虑“打包”。“malloc/new并自行实施。这将非常复杂,但可能是最糟糕的情况。

考虑到评论中的额外信息,以下是一些需要检查的内容:

应用程序是否使用优化(-O1,-O2等)编译?如果是,请在不使用这些选项的情况下重新编译。我自己在Cavium Octeon(MIPS)上交叉编译时遇到过这种情况,并发现存在优化标志会导致无法看到符号

可能是堆栈被破坏了吗?如果是这样的话,我认为所有的帧都会被破坏。你有没有可能使用Valgrind之类的工具来检查你的内存是否被破坏了?或者至少在Linux上运行应用程序

在进一步讨论之前,您真的需要进一步了解前3帧吗?难道还不知道它在malloc中崩溃了吗?也许您应该考虑一下是什么导致了malloc中的崩溃。在前面提到的同一Cavium平台中,我们遇到了一个问题,即如果我们在没有数据的情况下调用malloc/new,系统会崩溃内存被保留:(即使在通知他们错误后,我们也不得不使用一种黑客破解方法。在调用malloc/new时是否检查NULL?如果从多个不同的位置调用它,这可能会很困难。我们包装了new/malloc,因此这对我们来说很容易做到

在OP提供更多评论后更新

<> P>如果内存不足,它不应该崩溃,而不是由于内存泄漏,但要检查MALLC是否返回空。您还应该考虑使用“内存外处理程序”。
在同一个Cavium平台上,我们遇到了类似的内存损坏问题,很难找到(我们还不能在Linux上使用valgrind运行它)我们找到了一种方法来检查内部内存头的有效性,每次我们都做了一个MALOC。这确实减慢了它的速度,但最终它让我们找到了问题。如果你不能访问这样的东西,或者Linux上的ValGRIND,你可以考虑“打包”。malloc/new并自己实现。这将非常复杂,但可能是最糟糕的情况。

我想说最后三个框架不知何故没有有效的信息。猜测:可能是从malloc调用的一些汇编函数(尽管这些框架应该是可读的)


但由于您确实知道同一个库中malloc的地址,因此可以计算该帧中PC的相对差异(例如,帧#2为:-1f50).使用交叉工具链,objdump-d libc.so,并检查malloc的代码-这一差异…

我想说最后三个框架不知何故没有有效的信息。猜测:可能是从mal调用的一些汇编函数