当前位置:C++技术网 > 精选软件 > Linux使用coredump文件调试系列:4 加载不出来调试信息的问题解决办法

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

更新时间:2018-12-14 10:58:07浏览次数:1+次

    在《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告诉我要安装一个调试信息的库,一般叫做符号库。

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

    如果你看到的堆栈里,所有的都是问号,那无疑就是缺少符号库
    还有一种情况,就是版本不对。这会导致一个问题,那就是函数名部分有,部分没有。当然这种情况就不好预测了,不同的库可能实现不一样,按照一个未知的不正确库去解析一个堆栈信息,自然可能错误千奇百怪了。
    而如果上一层的函数名能正常显示而底层的没有显示,很可能就是底层的符号库没有安装,而上层的符号库是有的。
    我们这里是要排除非调试版本程序的,因为非调试版不再我们的使用范围内,这样的版本都不带调试信息,如何调试呢?
    如果缺少符号库,gdb会做上面的提示的,我们按照提示来安装就好了。如果没有提示,你也自己安装一下。
2.安装符号库
    按照提示,我们去输入命令:

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.我们不能随便创建一个文件,所以我这里给大家一个完整的文件

    当然参数也是设置好了的。前面说的参数就是最后一个enable,要改为1,我们这里已经设置好。你只要将下面的内容复制到一个文件里,然后放到/etc/yum.repos.d目录,文件名为CentOS-Debuginfo.repo。
    CentOS-Debuginfo.repo文件的内容如下:

# 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
    如果是新系统,一般执行下来,按照提示,一般可以顺畅的搞定。如果是系统设置混乱了的话,就需要根据提示一个个的解决问题了。