OpenAtom OpenHarmony(简称“OpenHarmony”)适配新的开发板时,启动流程init大概率会出现问题,其为内核直接拉起的第一个用户态进程,问题定位手段只能依赖代码走读和增加调试打印,初始化过程中系统崩溃的问题就更难定位了。如果能使用gdb调试init,会极大提高定位效率。本文将详细阐释二次启动的标准系统如何使用gdb调试init。
1. 编译出带debug信息的调试版本
将gdb打包到系统镜像中。init不正常的情况下,系统无法正常启动工作,无法使用hdc工具加载gdb工具,所以直接在制作镜像时,将其打包到系统镜像bin目录下。修改device\board\hihope\rk3568\cfg\BUILD.gn打包脚本如下,注意保证gdb工具已放置在此本目录下。
2. 调试版本镜像带符号,需要修改镜像配置文件,修改其大小限制,尤其是system.img,编译失败时不会提示实际镜像大小,需要修改到5G以上。
3. 编译调试版本,打开版本调试开关
./build.sh --product-name=XXX --gn-args="is_debug=true use_unstripped_as_runtime_outputs=true"
上述debug版本只能调试普通功能而不能调试init,还需要对init服务的源码进行部分适配修改,init功能调试正常后,需将源码恢复。
首先,在init挂载好system、vendor等镜像,并将根目录切换到system镜像后,在启动第二阶段init时,切换到shell下,停止init初始化流程,见下图B处。
注意:A处的CloseStdio()需要注释掉。
考虑用gdb启动init第二阶段,init绝大部分处理流程都在这一阶段,从这里开始就可以用gdb调试了,init第一阶段处理相对而言流程简单一些,代码走读和调试打印基本就能解决问题。
在init主函数中去掉“不等于进程1就返回的处理”,因为用gdb起init第二阶段时,其进程非1。
欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。
`欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案)
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......
init进程中不初始化Paramworkspace,前面pid=1的判断,在gdb调试init时条件不成立,所以此处增加判断init名就直接退出的处理。
做好了上述准备,就可以用gdb调试init:
把系统启动,改造后的init初始化第一阶段完成后,会停在shell下,此时使用下述命令启动init第二阶段:
gdb --args /bin/init --second-stage
为了调试init的子进程,还需要gdb下述命令
set follow-fork-mode child
本文章针对OpenHarmony系统在调试init初始化流程时,缺少高效的问题定位手段这一痛点,引入了嵌入式系统开发的主流调试工具——gdb,详细描述了这一方法涉及到的版本编译、适配点修改以及调试命令操作等细节处理,指导开发者提高定位init问题的效率。
需要注意,当前gdb调试init方法有局限,不适用轻量级系统、小型系统和一次启动的标准系统。
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。