【问题标题】:gdb backtrace is not showing full stack-trace with main()gdb 回溯未显示带有 main() 的完整堆栈跟踪
【发布时间】:2013-11-16 20:52:37
【问题描述】:

我正在使用Xalan library。我的程序在 Xalan 调用中的某个地方崩溃了。我希望看到从 main() 一直到崩溃点的完整堆栈跟踪。我正在使用以下命令行进行编译

g++ -o program.out -g -O0 -lxalan-c myprogram.out

我正在使用“backtrace full”命令并得到以下输出

 #0  0xb79313b4 in xalanc_1_11::XPath::findRoot(xalanc_1_11::XPathExecutionContext&,    xalanc_1_11::XalanNode*, int const*, int, xalanc_1_11::MutableNodeRefList&) const () from     /usr/lib/libxalan-c.so.111
No symbol table info available.
#1  0xb793afa9 in xalanc_1_11::XPath::step(xalanc_1_11::XPathExecutionContext&, xalanc_1_11::XalanNode*, int const*, xalanc_1_11::MutableNodeRefList&) const
() from /usr/lib/libxalan-c.so.111
No symbol table info available.
#2  0xb793d350 in xalanc_1_11::XPath::locationPath(xalanc_1_11::XalanNode*, int const*,  xalanc_1_11::XPathExecutionContext&) const ()
from /usr/lib/libxalan-c.so.111
No symbol table info available.
#3  0xb7937d22 in xalanc_1_11::XPath::executeMore(xalanc_1_11::XalanNode*, int const*,  xalanc_1_11::XPathExecutionContext&) const ()
from /usr/lib/libxalan-c.so.111
 No symbol table info available.
 #4  0xbffff02c in ?? ()
 No symbol table info available.

上面的堆栈跟踪显然没有显示从 main() 开始的完整堆栈跟踪,我错过了什么?

只有一个线程在运行,这里是show threads的输出

  Id   Target Id         Frame
 * 1    Thread 0xb6f79980 (LWP 8888) "xmltest.out" 0xb79313b4 in xalanc_1_11::XPath::findRoot(xalanc_1_11::XPathExecutionContext&, xalanc_1_11::XalanNode*, int const*, int, xalanc_1_11::MutableNodeRefList&) const () from /usr/lib/libxalan-c.so.111

【问题讨论】:

  • 你是不是在使用可以在 main() 之前实例化的全局类中的 Xalan?
  • Xalan 在我写的一个类中使用,但是它在 main() 的堆栈中被实例化
  • 那么,我敢打赌堆栈已经以某种方式损坏,因此,您在回溯中看不到调用函数。尽管valgrind 在堆栈损坏方面不是很强大,但也许您可以使用它来获取更多信息。
  • 什么是 valgrind ?像 gdb 这样的单独工具?我可以在哪里安装它?它有用于 opensuse 的 zypper/rpm 包吗?
  • 使用 -g 重建 libxalan-c,你应该会看到回溯。

标签: c++ gdb


【解决方案1】:

使用 -g 重建 libxalan-c,您应该会看到通过它的回溯。

如 cmets 中所述,某些目标可能需要 -ggdb 或 -ggdb3 而不是 -g。

【讨论】:

  • 您似乎认为-g 是正确回溯所必需的,这是错误的。如果使用-g 重建有帮助,那只会是偶然的。
  • “用符号重建 xalan”帮助了我。 Xalan 为其配置脚本提供了一个参数,用于生成调试符号。谢谢
  • @EmployedRussian 你可能是对的,它的 -ggdb 或 -ggdb3 以获得完整信息。
【解决方案2】:

很可能堆栈已损坏,因此,您无法看到回溯的来源。

虽然valgrind 在堆栈损坏方面不是很强大,但您可以使用它来获取更多信息。如果您使用的是 Linux,您可以在发行版的开发包存储库中找到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多