OpenHarmony系统使用gdb调试init

文章介绍了在OpenHarmony适配新开发板时,如何通过gdb调试init进程以提升问题定位效率。包括编译带调试信息的版本,修改镜像配置,打开调试开关,并对init源码进行适当修改。调试方法适用于标准系统,但不适用于轻量级或小型系统。

前言

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方法有局限,不适用轻量级系统、小型系统和一次启动的标准系统。

<think>用户问的是在OpenHarmony中如何手动产生异常。首先,我需要明确OpenHarmony系统架构,特别是异常处理的机制。OpenHarmony是基于Linux内核的,所以可能涉及到内核态和用户态的异常处理。 首先,用户可能想知道如何通过代码触发异常,比如除以零、空指针访问等。在用户态的应用程序中,这些可以通过标准的编程错误来实现。但OpenHarmony作为操作系统,可能还有更底层的异常触发方式,比如通过系统调用或内核模块。 另外,OpenHarmony可能提供了特定的API或工具来模拟异常情况,用于测试或调试。例如,使用调试工具如GDB系统自带的调试功能来注入异常。 还需要考虑硬件相关的异常,比如通过GPIO操作触发硬件中断,或者使用特定的硬件寄存器来产生异常。此外,OpenHarmony的设备驱动开发中,如何模拟硬件故障来测试驱动程序的错误处理能力。 还需要注意,手动产生异常可能涉及到系统安全性和稳定性,因此需要谨慎操作,避免导致系统崩溃或数据丢失。可能需要特定的权限或环境设置,比如在开发板或模拟器中进行,而不是在生产环境中。 总结来说,回答需要涵盖用户态和内核态的异常触发方法,使用代码示例,以及相关的工具和注意事项。同时,需要确保回答符合用户的问题要求,包括在回答后提出3-5个相关问题。</think>在OpenHarmony中手动产生异常可通过以下方式实现,适用于系统调试、异常处理测试等场景: ### 1. **用户态程序主动触发** 通过编写代码主动制造异常,例如: ```c // 除零异常(SIGFPE) int result = 10 / 0; // 空指针访问(SIGSEGV) int* ptr = NULL; *ptr = 10; ``` ### 2. **内核态异常注入** 通过内核模块或系统调用触发,需开发自定义驱动: ```c // 示例:内核模块触发页面错误 static int __init test_init(void) { // 故意访问无效内存地址 *(int*)0 = 0; return 0; } module_init(test_init); ``` ### 3. **使用调试工具** - **GDB调试器**:通过`set $pc = 无效地址`强制修改程序计数器触发异常。 - **系统调试工具**:如`hilog`、`hdcd`等工具结合断点设置模拟异常场景。 ### 4. **硬件中断模拟** 通过GPIO操作或外设寄存器配置触发硬件中断(如NMI),需硬件开发板支持。 ### 注意事项 - 需在开发/调试环境操作,避免影响生产设备。 - 异常触发后需配合系统日志(`dmesg`、`hilog`)分析处理流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值