如何为 GDB 安装 Debuginfo 包

跳转至: 导航, 搜索

openSUSE 使用过程中,有时候难免遇到需要使用 GDB 侦错调试的情况(比如你编译的软件出现了 Segmentation Fault 分页错误),这时就需要安装 *-debuginfo 调试信息包。本文教您如何安装调试信息包。

zypper 方法(简单)

openSUSE 下的 GDB 是做过 openSUSE 整合的,因此当您在 GDB 中输入 `run` 的时候,它会直接把缺失的调试信息符号和该符号所在软件包的安装方法都提示给您,如:

Missing separate debuginfo for /usr/lib64/YaST2/plugin/libpy2ag_xml.so.2
Try: zypper install -C "debuginfo(build-id)=ad78ac4282f6640c3c9ac2569dce742d4e22ca5b"

之所以说 zypper 方法比较简单,原因就在这里,您只需要:

开启 Debug 源,可以在「YaST 控制中心」-「软件源」-「添加」-「社区源」里选择,也可以直接用一条 zypper 命令添加:

sudo zypper ar -f http://download.opensuse.org/debug/distribution/13.1/repo/oss/ Debug
sudo zypper ref

然后直接复制那条命令、前面加 sudo 即可:

sudo zypper install -C "debuginfo(build-id)=ad78ac4282f6640c3c9ac2569dce742d4e22ca5b"
正在加载软件源数据...
正在读取已安装的软件包...
已安装过了 'yast2-xml-debuginfo',其提供了 'debuginfo(build-id) = ad78ac4282f6640c3c9ac2569dce742d4e22ca5b'。
正在解决软件包依赖关系...

无事可做。

YaST 方法(略显麻烦,但可视效果较好)

zypper 方法的缺点在于,它太「高效」了,高效到有时候你都不能理解「为什么要这么做」甚至不会注意「我究竟安装了哪些软件包」,对于控制欲太强的人可能不是什么好主意。所以我们也提供了 YaST 方法,这种方法比起 zypper 方法慢很多,但您能深入体会到 zypper 方法的来源,并且跟安装普通软件包的方法差不多。

首先还是添加 Debug 软件源。

zypper 方法注意的是 zypper 那行,这种方法我们要注意的是这行:

Missing separate debuginfo for /usr/lib64/YaST2/plugin/libpy2ag_xml.so.2

然后使用通用的 RPM 查询机制:

rpm -qf /usr/lib64/YaST2/plugin/libpy2ag_xml.so.2
yast2-xml-3.0.0-2.1.2.x86_64

也就是说,直接查询缺失调试信息的那个文件。因为在编译的时候,debuginfo 是从编译好的文件也就是 libpy2ag_xml.so.2 中自动 strip(剥离)出来的(因此知道文件也就知道了要哪个调试信息包),甚至连包的属性都是标准的,比如所有的 debuginfo 调试信息包都提供了 build-id,也就是 debuginfo(build-id)=ad78ac4282f6640c3c9ac2569dce742d4e22ca5b,所以你用 zypper 才能直接定位到这个软件包。

现在你知道了缺失调试信息的文件所在的软件包叫 yast2-xml,那么这个软件包对应的调试信息包就叫做 yast2-xml-debuginfo,同时也是缺失调试信息的文件的调试信息所在的软件包。用 YaST2 软件管理直接安装这个软件包即可。

常见问题

CRC Mismatch

有时候您会遇到这个提示:

warning: the debug information found in "/usr/lib/debug//usr/lib64/libgvfscommon.so.0.0.0.debug" does not match "/usr/lib64/libgvfscommon.so.0" (CRC mismatch).

warning: the debug information found in "/usr/lib/debug/usr/lib64/libgvfscommon.so.0.0.0.debug" does not match "/usr/lib64/libgvfscommon.so.0" (CRC mismatch).

这是因为你安装的 debuginfo 包跟你的主包的版本号不一致造成的,一般情况下把主包升级一下即可。

No module named backtrace

有时候您会遇到这个错误:

Traceback (most recent call last):
  File "/usr/share/gdb/auto-load/usr/lib64/libgobject-2.0.so.0.3800.1-gdb.py", line 9, in <module>
    from gobject import register
  File "/usr/share/glib-2.0/gdb/gobject.py", line 3, in <module>
    import gdb.backtrace
ImportError: No module named backtrace

这是个不用理会的错误,对结果没有影响。