源码级调试Ubuntu的系统程序

本文介绍了如何在Ubuntu 20.04上进行系统程序的源码级调试,包括添加符号仓库、安装符号文件、使用gdb设置断点,并详细阐述了安装源代码进行调试的步骤,便于读者体验并理解Linux调试过程。
Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

为了减小发布版本的大小,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符号。

d606f4173edd307de6db78a06efa7a22.png

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

(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命令便可以列源代码了

cfc2cfc9f1a4b059cfa779d9a471d514.png

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

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

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

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

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

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

15b754c76c648b14ddb2211ef7a2c37b.png

也欢迎关注格友公众号

73a45959f23d5e571575e0a85dc974ec.png

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值