OpenHarmony系统使用gdb调试init

OpenHarmony开发者 OpenHarmony开发者 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

前言

 

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处。源码详见base\startup\init\ services\init\standard\init.c。

 

 

注意:A处的CloseStdio()需要注释掉。

 

考虑用gdb启动init第二阶段,init绝大部分处理流程都在这一阶段,从这里开始就可以用gdb调试了,init第一阶段处理相对而言流程简单一些,代码走读和调试打印基本就能解决问题。

 

在init主函数中去掉“不等于进程1就返回的处理”,因为用gdb起init第二阶段时,其进程非1。源码详见base\startup\init\services\init\main.c。

 

 

init进程中不初始化Paramworkspace,前面pid=1的判断,在gdb调试init时条件不成立,所以此处增加判断init名就直接退出的处理。源码详见base\startup\init\services\param\base\param_base.c。

 

 

做好了上述准备,就可以用gdb调试init:

 

把系统启动,改造后的init初始化第一阶段完成后,会停在shell下,此时使用下述命令启动init第二阶段:

 

gdb --args /bin/init --second-stage

 

为了调试init的子进程,还需要gdb下述命令

set follow-fork-mode child

 

 

总结

 

本文章针对OpenHarmony系统在调试init初始化流程时,缺少高效的问题定位手段这一痛点,引入了嵌入式系统开发的主流调试工具——gdb,详细描述了这一方法涉及到的版本编译、适配点修改以及调试命令操作等细节处理,指导开发者提高定位init问题的效率。

 

需要注意,当前gdb调试init方法有局限,不适用轻量级系统、小型系统和一次启动的标准系统。

...全文

相关推荐

【鸿蒙南向开发】OpenHarmony系统使用gdb调试init

本文章针对OpenHarmony系统在调试init初始化流程时,缺少高效的问题定位手段这一痛点,引入了嵌入式系统开发的主流调试工具——gdb,详细描述了这一方法涉及到的版本编译、适配点修改以及调试命令操作等细节处理,指导开发者提高定位init问题的效率。需要注意,当前gdb调试init方法有局限,不适用轻量级系统、小型系统和一次启动的标准系统。

「已注销」

OpenHarmony实战——使用gdb调试init

OpenAtom OpenHarmony(简称“OpenHarmony”)适配新的开发板时,启动流程init大概率会出现问题,其为内核直接拉起的第一个用户态进程,问题定位手段只能依赖代码走读和增加调试打印,初始化过程中系统崩溃的问题就更难定位了。如果能使用gdb调试init,会极大提高定位效率。本文将详细阐释二次启动的标准系统如何使用gdb调试init。1. 编译出带debug信息的调试版本将gdb打包到系统镜像中。

我命油我不有天

OpenHarmony 4.1 QEMU运行报错全解析:从‘Lockup’异常到成功启动的调试实战

本文深入解析OpenHarmony 4.1在QEMU模拟器中运行时遇到的‘Lockup’异常问题,提供从错误分析到成功启动的完整调试指南。通过硬件模拟器与操作系统的协同机制分析、异常信息解码及典型问题解决方案,帮助开发者快速定位和解决兼容性问题,提升开发效率。

Agile牧

OpenHarmony 4.1在QEMU里跑飞了?手把手教你调试ARM Cortex-M4模拟器异常

本文详细解析OpenHarmony 4.1在QEMU模拟器中运行Cortex-M4时出现的异常问题,提供从寄存器分析到调试环境搭建的完整解决方案。通过实战案例展示如何利用GDB工具链定位内存冲突、中断配置等典型问题,帮助开发者快速解决模拟器环境下的系统锁死故障。

Agile牧

当OpenHarmony 4.1在QEMU里‘跑飞’了:一次ARM Cortex-M4模拟器异常崩溃的调试记录与思考

本文记录了OpenHarmony 4.1在QEMU模拟器中运行ARM Cortex-M4时发生的HardFault异常崩溃事件。通过详细分析异常日志、QEMU环境适配问题及ARM Cortex-M4异常处理机制,提出了多维度解决方案,并分享了模拟器开发的最佳实践,帮助开发者避免类似问题。

Agile牧
评论
收藏 已收藏
分享
返回顶部