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

之前写过很多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
接着跑

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

时间: 2024-11-02 16:09:05

如何调试系统启动过程中systemd的代码的相关文章

敏捷过程中如何保证代码质量

本文目录:一.为什么要做代码质量分析二.常见的代码质量分析工具三.DevOps平台中的代码质量分析四.DevOps平台中如何为代码质量提供保障 一.为什么要做代码质量分析 本文讲的是敏捷过程中如何保证代码质量,在软件开发过程中,当一个功能开发完成后,如何去保证代码是可用的.没问题的?一般情况下,基本都会有单元测试.每日构建.功能测试等环节来保证.但是,保证代码可用就够了吗?显然不是. 一个软件项目开发完一个版本会有下一个版本,会有新的需求,原来的功能也可能会变更.你写的代码可能会被别人使用,你也

ios-AppCan中 iOS原生代码 调试插件 中出现的问题

问题描述 AppCan中 iOS原生代码 调试插件 中出现的问题 在调试插件过程中 index.html中的 按钮可以调用createDemo(); 但是createDemo();中得uexDemo.open是怎么回调的? function createDemo(){ alert("----"); uexDemo.open('0','120','320','416'); } uexDemo在plugin.xml中写了 <?xml version="1.0" e

在网站建设过程中主要在哪几个方面为后期的网站优打好根基?

虽然说网站的搭建和网站优化是前后关系,但是我们企业要在网站搭建的过程中,就要把后期网站优化的工作全部在一起规划. 有些企业网站建设上线,可是搜索引擎几个月都没有收录,而就算收录了,也只有一个首页和几个栏目页,这明显是网站建设过程没有为网站后期优化打好基础.那么我们今天就来分享一下,在网站建设过程中主要在哪几个方面为后期的网站优化做好准备. 1.网站布局要让搜索引擎喜欢设计师在规划版块设计的时候,即要符合企业的定位又要符合搜索引擎抓取的习惯.要多考虑用文字表达,少用JS和图片.文字撰写里面一般都会

vs2012设置-vs2012如何在调试过程中修改代码

问题描述 vs2012如何在调试过程中修改代码 我设置了编译并继续也不行啊,求哪位大神给个详细步骤 多谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 解决方案 也不是所有地方都可以修改并继续的,具体看你调试执行的位置与你修改的代码的关系(执行过的方法都会压入内存栈中),有时即使你改了也要下次调试才能真正生效 ,这是我在网上给你找来的答案

F5调试代码的过程中,如何知道目前代码运行的位置

问题描述 F5调试代码的过程中,如何知道目前代码运行的位置,就是代码运行到哪行,请各位指教 解决方案 解决方案二:你知道F10和F11吗?在IDE里面试试她们是干什么的...解决方案三:引用1楼u012804018的回复: 你知道F10和F11吗?在IDE里面试试她们是干什么的... f10f11我会用,就是窗体已经按f5启动了,在ide调试f10,看不到窗体的变化,我想要通过操控窗体看到代码运行到哪行,正在学习别人的程序,有的功能找不到代码位置.解决方案四:引用2楼fyfy918的回复: Qu

visual studio-VS2013调试过程中断电后异常0x5396E06C

问题描述 VS2013调试过程中断电后异常0x5396E06C 在调试过程中突然断电,然后来电后再进工程起动调试出现如下的异常,在网上也没有查到相关的处理方法,望哪位帮我参考解决一下,谢谢! 0x5396E06C (mfc120d.dll) (FTD Test Tool.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0x00000068 时发生访问冲突. 解决方案 重新生成试试,或重新打开VS,或重新启动电脑,或重新新建个项目,应该没事吧 解决方案二: dll坏了? 试一下

jsp-JSP中编写JS代码过程中,调用了一个JSP表达式,发现一个问题,麻烦各位大神解答

问题描述 JSP中编写JS代码过程中,调用了一个JSP表达式,发现一个问题,麻烦各位大神解答 背景: 楼主使用Myelipse新建了一个Web项目,在编写一个JSP文件的时候遇到一个问题,首先是使用了img,并且写了一个事件,代码如下: <imgclass="poke" src="poke/back.jpg" title="hit" id="play_id_3" onClick="change_pic()&qu

c#代码-C#编程过程中遇到的难题

问题描述 C#编程过程中遇到的难题 我的界面form_load一打开适合一张数据库里面的退货表联系上了的,但是如果我想要查询 订单表的话,怎么做呢?而且是不换界面的,因为我的界面使用的是数据网格来显示表格,当我点击查询的订单表的时候,总是会弹出ConnectionString尚未初始化这个问题?怎么解决呢?以下是我查询的代码,求指导 SqlCommand sqlCommand = new SqlCommand(); SqlConnection myConnection = new SqlConn

android-Android开发问题,安卓环境搭建完成后,调试过程中eclipse报错的问题

问题描述 Android开发问题,安卓环境搭建完成后,调试过程中eclipse报错的问题 安卓环境搭建 eclipse报 The connection to adb is down and a severe error has occured.You must restart adb and Eclipse.Please ensure that adb is correctly located at 'D:shithashadt-bundle-windows-x86_64-20140321sdk