为了减小发布版本的大小,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符号。
此时就可以使用函数名设置断点了。比如:
(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命令便可以列源代码了
可以看到源代码签名中有大名鼎鼎的理查德•斯托曼。
以上步骤与几年前写的步骤只是略有变化,今日在给一家老客户上LINUX调试课程时有学员问起Ubuntu 20.04上的具体步骤,于是整理了一下,顺便分享给格友们。过程很简单,大家不妨有空时体验一下,顺便品味一下斯托曼先生所写的代码。
(写文章很辛苦,恳请各位读者点击“在看”,也欢迎转发)
*************************************************
正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生
扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物
也欢迎关注格友公众号