如何调试系统启动过程中systemd的代码

简介: 之前写过很多kernel的gdb debug, 其实用户态也是可以调试的, 只是在共享库的动态地址上不是很好处理, 最近同事有调试系统启动过程中systemd的需求, 简单研究了一下 其实qemu kvm打断点并不区别kernel还是用户态, 都是rip的值等于某个地址或者遇到断点指令了, 所以开机的时候把断点打到systemd的main上就可以了 但是其实另外一个问题是, 用户态的地

之前写过很多kernel的gdb debug, 其实用户态也是可以调试的, 只是在共享库的动态地址上不是很好处理, 最近同事有调试系统启动过程中systemd的需求, 简单研究了一下

其实qemu kvm打断点并不区别kernel还是用户态, 都是rip的值等于某个地址或者遇到断点指令了, 所以开机的时候把断点打到systemd的main上就可以了

但是其实另外一个问题是, 用户态的地址是很多进程共享的, 这时候有可能会另一个进程也跑到了这个地址, 所以断点就需要条件断点, 用进程的pid是一个好方法,

下面是简单得步骤
第一步, 开机暂停

sudo qemu-system-x86_64 -drive file=centos7.vhd,if=virtio -vnc :11 -enable-kvm  -serial mon:stdio -smp 8 -m 1024 -redir tcp:1011::22 -append "root=/dev/vda1 console=ttyS0 slub_debug=PFZ ro norandmaps" -kernel /home/shidao.ytt/alikernel/7u/arch/x86/boot/bzImage -s -S

kernel 参数 norandmaps很重要, 不然的话, 共享库的地址每次都不一样, 加了这个参数, 每次共享库的地址都是一样的, 就不用考虑共享库动态地址的问题了

第二步, 连接qemu, 打断点到systemd的main

/usr/bin/gdb vmlinux -ex 'target remote :1234' -ex 'thb start_kernel' -ex c

(gdb) add-symbol-file /usr/lib/debug/usr/lib/systemd/systemd.debug 0x0000555555573b60

这里说明一下, 因为要调试guest的systemd代码, 所以要在物理机上安装guest的systemd的debuginfo, 这个很好处理, 去centos下载debuginfo rpm安装就可以了

后面的地址0x0000555555573b60是systemd映射到进程代码段的加载地址, 这个地址如何获得, 开机一次, 去查看pid 1进程的vm映射空间就可以了, 简单一点就是gdb -p 1, info files就可以了

(gdb) thbreak *0x5555555752c0 if $lx_current().pid == 1
Hardware assisted breakpoint 2 at 0x5555555752c0: file src/core/main.c, line 1244.

简单说明, 因为systemd进程都还没起来, 所以是没有这个地址的, 所以一定需要用hardware breakpoint, 后面是条件判断, 只有pid为1的时候生效, 这个就是断点打到具体进程的利器了

c
接着跑
![image.png](http://ata2-img.cn-hangzhou.img-pub.aliyun-inc.com/f0b46477c660776e64219e06c60084f9.png)

只要打断点的时候加入pid的条件限制, 就可以打到任意的进程了

目录
相关文章
|
C++ Windows
使用 windbg gflags dumpbin 排查应用程序启动错误
使用 windbg gflags dumpbin 排查应用程序启动错误
|
3月前
|
Linux
在Linux中,怎么把脚本添加到系统服务里,即用 service 来调用?
在Linux中,怎么把脚本添加到系统服务里,即用 service 来调用?
|
3月前
|
Linux
在Linux中,哪些命令可以管理系统服务,如启动、停止、重启一个服务?
在Linux中,哪些命令可以管理系统服务,如启动、停止、重启一个服务?
|
6月前
|
缓存 监控 Linux
如何实现 Linux 服务 Crash 后自动重启?
如何实现 Linux 服务 Crash 后自动重启?
|
Linux
如何在 Systemd 下配置并运行关机前的脚本?
如何在 Systemd 下配置并运行关机前的脚本?
257 0
如何在 Systemd 下配置并运行关机前的脚本?
|
监控 Linux Shell
Linux应用程序重启:优雅实现应用程序的自动重启
在Linux服务器运行应用程序时,如果应用程序出现崩溃或异常终止,为保证服务的可靠性,自动重启是一种常见的应对措施。本文将介绍Linux下实现应用程序自动重启的方法,并提供代码实现例子,帮助读者优雅地处理应用程序的崩溃和重启。
3094 0
|
监控 Shell Linux
systemd调试
systemd调试,参考https://freedesktop.org/wiki/Software/systemd/Debugging/
1584 0
|
Windows
Cypress 本身启动过程的调试(2)
Cypress 本身启动过程的调试
|
资源调度
Cypress 本身启动过程的调试(1)
Cypress 本身启动过程的调试
WinCE系统启动时自动运行应用程序之二
Windows CE 4.2平台下创建工程SMDK2440(目录为C:/WINCE420/PUBLIC/SMDK2440)且Build(或者Rebuild)成功;假定需要自动运行的的应用程序为CEDEMO.exe