源码级调试Ubuntu的系统程序

为了减小发布版本的大小,Ubuntu的系统模块都是剥离了符号的,比如使用readelf --debug-dump /bin/ls观察,它没有任何DWARF格式的符号。

gebox@gebox-VirtualBox:~$ readelf --debug-dump /bin/ls

Contents of the .gnu_debuglink section:

  Separate debug info file: 15ad836be3339dec0e2e6a3c637e08e48aacbd.debug

  CRC value: 0x371907fb

(上面的build-id是用来定位与剥离出去的符号文件匹配使用的。)

因此,要想调试ls这样的系统程序,常用的方法就是从Ubuntu的符号服务器来安装符号,以下是针对Ubuntu 20.04的典型操作步骤。

1. 增加符号仓库的位置信息,建议使用如下命令自动产生一个新的配置文件

echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse

deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse

deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | 

sudo tee -a /etc/apt/sources.list.d/ddebs.list

2. 执行如下命令安装PGP公钥,这一步是必要的,没有这一步,下一步会失败。

sudo apt install ubuntu-dbgsym-keyring

3. 更新仓库信息:

sudo apt update

成功完成以上三步后,就可以安装符号文件了,比如要安装包含ls的符号coreutils包,那么只要执行:

sudo apt install coreutils-dbgsym

安装好的符号在/usr/lib/debug/.build-id/目录下。

执行gdb ls尝试调试,gdb会显示如下加载符号的信息:

Reading symbols from ls...

Reading symbols from /usr/lib/debug/.build-id/2f/15ad836be3339dec0e2e6a3c637e08e48aacbd.debug...

第二行显示的/usr/lib/debug/.build-id/2f/15ad836be3339dec0e2e6a3c637e08e48aacbd.debug便是ls的符号文件,现在再执行readelf --debug-dump /usr/lib/debug/.build-id/2f/15ad836be3339dec0e2e6a3c637e08e48aacbd.debug会看到里面的DWARF符号。

源码级调试Ubuntu的系统程序_第1张图片

此时就可以使用函数名设置断点了。比如:

(gdb) b readdir

Breakpoint 2 at 0x7ffff7e7c470: file ../sysdeps/posix/readdir.c, line 39.

如果还希望安装源代码,实现源代码调试,那么需要再做如下三步:

1. 修改sources.list,将原本注释掉的deb-src放出来,也就是将# deb-src 替换为deb-src. 可以使用sudo gedit /etc/apt/sources/list命令

2. 更新仓库信息:sudo apt update

3. 安装源代码,比如apt source coreutils

安装好源代码后,就可以使用dir命令来指定源代码了,比如:

(gdb) dir coreutils-8.30/src/

Source directories searched: /home/gebox/coreutils-8.30/src:$cdir:$cwd

再执行l命令便可以列源代码了

源码级调试Ubuntu的系统程序_第2张图片

可以看到源代码签名中有大名鼎鼎的理查德•斯托曼。

以上步骤与几年前写的步骤只是略有变化,今日在给一家老客户上LINUX调试课程时有学员问起Ubuntu 20.04上的具体步骤,于是整理了一下,顺便分享给格友们。过程很简单,大家不妨有空时体验一下,顺便品味一下斯托曼先生所写的代码。

(写文章很辛苦,恳请各位读者点击“在看”,也欢迎转发)

*************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物

源码级调试Ubuntu的系统程序_第3张图片

也欢迎关注格友公众号

源码级调试Ubuntu的系统程序_第4张图片

你可能感兴趣的:(linux,java,ubuntu,python,docker)