Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何增加Linux核心转储匹配符号的概率?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个非常复杂的跨平台应用程序.最近我和我的团队一直在进行压力测试,并遇到了几次崩溃(以及随之而来的核心转储).其中一些核心转储非常精确,并向我展示了大约10个或更多堆栈帧发生崩溃的确切位置.其他人有时只有一个堆叠框架?? ??是唯一的象征!我想知道的是:>有没有办法增加核心转储指向正确方向的可能性?>为什么报告的堆栈帧数不一致?>任何管

我有一个非常复杂的跨平台应用程序.最近我和我的团队一直在进行压力测试,并遇到了几次崩溃(以及随之而来的核心转储).其中一些核心转储非常精确,并向我展示了大约10个或更多堆栈帧发生崩溃的确切位置.其他人有时只有一个堆叠框架?? ??是唯一的象征!

我想知道的是:

>有没有办法增加核心转储指向正确方向的可能性?
>为什么报告的堆栈帧数不一致?
>任何管理核心转储的最佳实践建议.

这是我编译二进制文件的方式(在发布模式下):

>编译器和平台:g在CentOS 3.6 x86_64上使用glibc-2.3.2-95.50 – 这有助于我保持与旧版Linux的兼容性.
>所有文件都使用-g标志进行编译.
>从最终二进制文件删除调试符号并将其保存在单独的文件中.
>当我有核心转储时,我使用GDB和创建核心的可执行文件以及符号文件. GDB从不抱怨核心/二进制/符号之间存在不匹配.

然而,我有时会得到没有符号的核心转储!可以理解的是,我正在链接libstdc和libgcc的非调试版本,但如果至少堆栈跟踪显示我的代码错误的指令调用源自哪里(尽管最终可能以??结尾),这将是很好的. .

最佳答案

这可能有很多原因,其中包括

>堆栈帧被删除(覆盖)
> EBP / RBP(在x86 / x64上)目前没有任何有意义的值 – 这可能发生在例如在使用-fomit-frame-pointer或asm单元编译的单元中

注意,第二点可以简单地通过例如以这种方式编译的glibc来进行.安装此类系统库的调试信息可以缓解这种情况(类似于openSUSE上的glibc-debug {info,sourcE}软件包).

gdb比glibc更能控制程序,因此如果gdb也不能这样做,glibc的回溯调用自然会无法打印回溯.

但是运输来源会容易得多:-)

大佬总结

以上是大佬教程为你收集整理的如何增加Linux核心转储匹配符号的概率?全部内容,希望文章能够帮你解决如何增加Linux核心转储匹配符号的概率?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。