System76 团队维护一个官方的 Linux 内核仓库(GitHub 链接),基于 Ubuntu 的,但是没有提供 debug(-dbg
)包,所以有些内核 debug 工具用不成,比如 drgn:Getting Debugging Symbols — drgn 0.0.23+unknown documentation
GitHub 上也有人提了 issue,快一年了也没人理,目前只能自己 build 了。好在流程很简单,我 checkout 了 commit d567a383cdc8 ("Tell thelio-io-2 about suspend status"),执行了 ./rebuild.sh
(按它说的装 build 依赖,缺什么装什么就行;我新装的系统,只预先装了个 pahole)和 ./reinstall.sh
,然后重启了一下,就换上新内核了:
ypl@pop-os:~$ uname -r
6.4.6-76060406-generic
./rebuild.sh
花了半个多小时,唉……不过终于可以用 drgn 了!试试,在 ./debian/build/build-generic/
里执行 sudo drgn --no-default-symbols -s ./vmlinux
:
drgn 0.0.23 (using Python 3.10.12, elfutils 0.189, with libkdumpfile)
For help, type help(drgn).
>>> import drgn
>>> from drgn import NULL, Object, cast, container_of, execscript, offsetof, reinterpret, sizeof
>>> from drgn.helpers.common import *
>>> from drgn.helpers.linux import *
>>> prog["nr_cpu_ids"]
(unsigned int)20
成了!呃,不过只有 vmlinux 的 debug 信息,没有内核 .ko
模块的:
>>> prog["fq_codel_enqueue"]
Traceback (most recent call last):
File "/usr/lib/python3.10/code.py", line 90, in runcode
exec(code, self.locals)
File "<console>", line 1, in <module>
KeyError: 'fq_codel_enqueue'
我犯懒了,用了个土办法:
>>> from pathlib import Path
>>> prog.load_debug_info(list(Path.cwd().rglob('*.ko')))
然后报了一堆 Too many open files
,哈哈哈,服了,.ko
太多了。我 ulimit -n
只有 1024,改大点就好了:
>>> prog["fq_codel_enqueue"]
(int (struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free))0xffffffffc102a7e0