0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony系统如何使用gdb调试init

OpenHarmony技术社区 来源:OpenHarmony技术社区 2023-01-15 15:53 次阅读

OpenHarmony 适配新的开发板时,启动流程 init 大概率会出现问题。

其为内核直接拉起的第一个用户态进程,问题定位手段只能依赖代码走读和增加调试打印,初始化过程中系统崩溃的问题就更难定位了。如果能使用 gdb 调试 init,会极大提高定位效率。

本文将详细阐释二次启动的标准系统如何使用 gdb 调试 init。

用 gdb 调试 init

①编译出带 debug 信息的调试版本

将 gdb 打包到系统镜像中。init 不正常的情况下,系统无法正常启动工作,无法使用 hdc 工具加载 gdb 工具,所以直接在制作镜像时,将其打包到系统镜像 bin 目录下。

修改 deviceoardhihope k3568cfgBUILD.gn 打包脚本如下,注意保证 gdb 工具已放置在此本目录下。

44ce7bc0-94a5-11ed-bfe3-dac502259ad0.png

②调试版本镜像带符号

需要修改镜像配置文件,修改其大小限制,尤其是 system.img,编译失败时不会提示实际镜像大小,需要修改到 5G 以上。

44dabc0a-94a5-11ed-bfe3-dac502259ad0.png

③编译调试版本,打开版本调试开关

./build.sh--product-name=XXX--gn-args="is_debug=trueuse_unstripped_as_runtime_outputs=true"

上述 debug 版本只能调试普通功能而不能调试 init,还需要对 init 服务的源码进行部分适配修改,init 功能调试正常后,需将源码恢复。

首先,在 init 挂载好 system、vendor 等镜像,并将根目录切换到 system 镜像后。

在启动第二阶段 init 时,切换到 shell 下,停止 init 初始化流程,见下图 B 处。

44e7c602-94a5-11ed-bfe3-dac502259ad0.png

源码详见 basestartupinit servicesinitstandardinit.c。注意:A 处的 CloseStdio() 需要注释掉。

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

在 init 主函数中去掉“不等于进程 1 就返回的处理”,因为用 gdb 起 init 第二阶段时,其进程非 1。

源码详见basestartupinitservicesinitmain.c。

44f51ef6-94a5-11ed-bfe3-dac502259ad0.png

init 进程中不初始化 Paramworkspace,前面 pid=1 的判断,在 gdb 调试 init 时条件不成立,所以此处增加判断 init 名就直接退出的处理。

源码详见 basestartupinitservicesparamaseparam_base.c。

45028e88-94a5-11ed-bfe3-dac502259ad0.png

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

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

gdb--args/bin/init--second-stage为了调试 init 的子进程,还需要 gdb 下述命令:setfollow-fork-modechild

451325d6-94a5-11ed-bfe3-dac502259ad0.png

总结

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gdb
    gdb
    +关注

    关注

    0

    文章

    60

    浏览量

    13295
  • init
    +关注

    关注

    0

    文章

    16

    浏览量

    3432
  • OpenHarmony
    +关注

    关注

    25

    文章

    3713

    浏览量

    16254

原文标题:OpenHarmony上使用gdb调试init

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    QEMU+GDB调试ARM程序

    通过GDB调试代码的便利性无需赘言。我们直接以调试meta-hypervisor为示例进行说明。
    的头像 发表于 10-08 09:17 2909次阅读

    使用GDB调试Linux应用程序

    本篇讲解使用GDB调试Linux应用程序,以下以 `hellowld.c` 为例介绍 GDB调试入门。
    发表于 06-27 15:48 462次阅读

    ubuntu下GDB调试GDB简介

    调试与图像编程ubuntu下GDB调试Opencv3.x的基本应用ubuntu下GDB调试GDB
    发表于 12-21 08:20

    OpenHarmony系统使用gdb调试init

    --second-stage为了调试init的子进程,还需要gdb下述命令set follow-fork-mode child总结本文章针对OpenHarmony
    发表于 01-10 11:34

    OpenHarmony系统使用gdb调试launcher应用程序

    代码修改HAP应用在初始化过程中由系统拉起,需要延缓其启动过程,方便使用gdb工具进程跟踪调试,修改下述部分代码,以方便gdb的使用。(以下代码在O
    发表于 04-10 09:26

    GDB调试命令手册

    GDB调试命令手册,感兴趣的可以下载看看。
    发表于 11-05 16:36 9次下载

    使用 GDB 调试多进程程序

    GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大。对于较为复杂的系统,比如多进程系统,如何使用
    发表于 04-02 14:33 547次阅读

    嵌入式Linux系统GDB远程调试的实现

    远 程调试环境由宿主机GDB和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准程串行协议协同工作,实现对目标机上的
    发表于 04-02 14:38 409次阅读

    Linux应用的GDB调试的原理及过程分析

    GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer。在应用程序调试
    发表于 03-05 09:44 3419次阅读
    Linux应用的<b class='flag-5'>GDB</b><b class='flag-5'>调试</b>的原理及过程分析

    OpenHarmony系统使用gdb调试init

    OpenHarmony适配新的开发板时,启动流程init大概率会出现问题,其为内核直接拉起的第一个用户态进程,问题定位手段只能依赖代码走读和增加调试打印,初始化过程中系统崩溃的问题就更
    的头像 发表于 12-26 12:10 924次阅读

    ARM平台如何玩转GDB远程调试

    前言关于GDB工具GDB工具是GNU项目调试器,基于命令行使用。和其他的调试器一样,可使用GDB工具单步运行程序、单步执行、跳入/跳出函数、
    的头像 发表于 09-28 18:17 975次阅读
    ARM平台如何玩转<b class='flag-5'>GDB</b>远程<b class='flag-5'>调试</b>?

    Linux系统GDB单步调试

    单步调试    gdb helloworld                         (gdb) break helloworld.c:18            (gdb
    的头像 发表于 09-26 16:22 608次阅读

    GDB调试工具的原理

    一、GDB调试工具的原理 1.1 未执行进程调试 启用gdb调试运行gdb ./test的时候,
    的头像 发表于 11-09 17:04 935次阅读
    <b class='flag-5'>GDB</b><b class='flag-5'>调试</b>工具的原理

    如何使用GDB调试工具

    在对应程序目录中使用下面的命令 gdb test 2、调试已经开始运行的程序进程 调试已经开始运行的程序进程,首先先用top命令查看运行的程序进程的pid如下: 比如我要加载的程序
    的头像 发表于 11-09 17:17 845次阅读
    如何使用<b class='flag-5'>GDB</b><b class='flag-5'>调试</b>工具

    如何使用linux下gdb调试python程序

    如何使用linux下gdb调试python程序  在Linux下,可以使用GDB(GNU调试器)来调试Python程序。
    的头像 发表于 01-31 10:41 2577次阅读