OpenHarmony系統使用gdb除錯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方法有侷限,不適用輕量級系統、小型系統和一次啟動的標準系統。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009402/viewspace-2930884/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux核心使用gdb除錯Linux除錯
- GDB除錯使用記錄除錯
- gdb除錯除錯
- C編譯: 使用gdb除錯編譯除錯
- Linux中使用GDB除錯程式Linux除錯
- GDB除錯指令除錯
- GDB除錯基礎使用方法除錯
- GDB 除錯程式碼除錯
- gdb除錯多程序除錯
- gdb除錯總結除錯
- gdb除錯快速上手除錯
- 使用GDB除錯Android Native 層程式碼除錯Android
- 在MacOS上使用gdb(cgdb)除錯Golang程式Mac除錯Golang
- C語言——gdb除錯C語言除錯
- 介紹 GDB 除錯 Go除錯Go
- 用GDB除錯程式(六)除錯
- GDB除錯命令詳解除錯
- gdb高階除錯命令高階除錯
- gdb除錯coredump檔案除錯
- 在海思晶片上使用GDB遠端除錯晶片除錯
- gdb除錯傳入引數除錯
- gdb除錯正在執行的程式除錯
- NASM 與 GDB 簡易除錯指南ASM除錯
- Linux—gdb除錯簡單實現Linux除錯
- OpenHarmony的init程式、init配置與啟動項配置
- gdb除錯core dump檔案之二除錯
- GDB除錯-從入門到實踐除錯
- gdb多執行緒多程序除錯命令執行緒除錯
- 自己動手從零寫桌面作業系統GrapeOS系列教程——12.QEMU+GDB除錯作業系統除錯
- c/c++ gdb 除錯帶引數的程式C++除錯
- gdb 除錯 new 一個物件主要兩個 handler除錯物件
- 利用QEMU+GDB搭建Linux核心除錯環境Linux除錯
- Golang原始碼學習:使用gdb除錯探究Golang函式呼叫棧結構Golang原始碼除錯函式
- gdb除錯嵌入式裝置的core檔案除錯
- 嵌入式系統除錯Uboot串列埠互動除錯除錯boot串列埠
- GDB 除錯 Mysql 實戰(一)原始碼編譯安裝除錯MySql原始碼編譯
- 安卓除錯 .so 斷到 JNI_OnLoad 或者 .init段安卓除錯
- vscode配置遠端linux系統除錯VSCodeLinux除錯