Linux使用coredump文件调试系列:4 加载不出来调试信息的问题解决办法

3611 人浏览 | 时间: 2018-12-05 18:09:35 | 作者: codexia 会员文章,禁止转载

    在《Linux使用coredump文件调试系列3-使用GDB调试coredump》中,我们知道了如何调试coredump文件,却不知道为什么堆栈信息就是显示不出来。其实是少了一些东西,需要安装一下。但是这个安装过程又非常曲折,所以又从头到尾总结了一下。
1.系统缺少调试符号库信息
    对于centos系统来讲,很可能是没有的,至少我的是centos6.8就没有。所以会提示:

Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64
    gdb告诉我要安装一个调试信息的库,一般叫做符号库。

    那么什么是符号库呢?简单来说,在生成调试信息的时候,编译器肯定不会说生成字符串来说明,所以一般都是二进制格式来存储,各个数值代表一定的意义。就好像你给每一个人编一个号,对应上一个名字,这样你就有一个姓名表。如果没有这个姓名表,你无法从一个序号里得知一个人的姓名的。符号库也是如此,如果没有符号库,你没有办法从堆栈信息里去找对应的函数名的。所以缺少符号库,尽管你开启了调试模式,内部是有一个堆栈,也有对应的函数的编号,但是你是不知道它是什么函数的,所以显示的都是问号,这样还怎么调试呢?

debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64
    如果你成功安装了,那么请重新编译一下程序,然后再来调试。编译的时候会加载符号库,然后将必要的调试信息加入到程序里。然后你再验证是否可以显示堆栈的函数名称了。如果能正常显示,恭喜你,不用往下看了。但是如果安装过程中有问题,请继续看。
3.安装的时候提示找不到
    找不到我们要安装的东西,提示如下:
Could not find debuginfo for main pkg: glibc-2.12-1.209.el6_9.2.x86_64
......
No debuginfo packages available to install
    这就尴尬了。那怎么办呢?根据网上的资料,我们可以修改yum库的一个文件的参数,然后再重新安装就可以了。这个库在/etc/yum.repos.d目录,文件是CentOS-Debuginfo.repo。然而,通过这个路径找,我竟然没有找到这个文件。那文件都不存在,如何修改?
4.我们不能随便创建一个文件,所以我这里给大家一个完整的文件
# CentOS-Debug.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#

# All debug packages from all the various CentOS-5 releases
# are merged into a single repo, split by BaseArch
#
# Note: packages in the debuginfo repo are currently not signed
#

[debug]
name=CentOS-6 - Debuginfo
baseurl=http://debuginfo.centos.org/6/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-6
enabled=1
5.重新安装符号库
    执行命令:
debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64
    如果是新系统,一般执行下来,按照提示,一般可以顺畅的搞定。如果是系统设置混乱了的话,就需要根据提示一个个的解决问题了。
当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。

相关阅读