在核心转储中看不到导致终止的异常
Posted
技术标签:
【中文标题】在核心转储中看不到导致终止的异常【英文标题】:Cannot see exception that caused termination in core dump 【发布时间】:2018-01-04 17:42:50 【问题描述】:我有一个在 ARM 上运行的用 c++ 编写的多线程程序。 我通过运行启用了应用程序的全局核心转储: echo "/var/log/core.%e.%t" > /proc/sys/kernel/core_pattern ulimit -c 无限制
程序中抛出了未被捕获的异常。 我打开了使用 eclipse 生成的核心转储。 我希望在调用堆栈中看到引发异常的代码。 但我看不到它。
其他线程的调用堆栈的其余部分看起来没问题 我试图手动将调用堆栈中第一行的 $SP 更改为详细的 termiate 行中定义的地址:0xb6eba0d8 但这会导致调用堆栈只显示系统调用行
如何在该线程的堆栈中查看更多行?
【问题讨论】:
听起来你的线程在我没有内置调试符号的库中。 也可能是堆栈损坏 堆栈很可能已损坏。所以你最好的选择是查看原始堆栈。例如,使用 gdb,您可以使用“x/10x $sp”查看前 10 个元素。然后你必须尝试将地址映射到函数。 【参考方案1】:有两个问题:
堆栈已展开。直到 GCC 8 - 使用 std::thread 时,调用用户线程函数的 libstdc++ 函数包含 try/catch all 语句。改用 pthread 可以解决这个问题。详情见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55917
我在尝试调试时使用了没有调试符号的 libstdc++。线程调用的函数是用调试符号编译的,但这还不够。我使用 file 命令查看 /usr/lib 中的库没有调试符号,所以我使用了我的 Linaro 发行版安装中的库。
【讨论】:
以上是关于在核心转储中看不到导致终止的异常的主要内容,如果未能解决你的问题,请参考以下文章