OpenHarmony 適配新的開發(fā)板時(shí),啟動(dòng)流程 init 大概率會(huì)出現(xiàn)問題。
其為內(nèi)核直接拉起的第一個(gè)用戶態(tài)進(jìn)程,問題定位手段只能依賴代碼走讀和增加調(diào)試打印,初始化過程中系統(tǒng)崩潰的問題就更難定位了。如果能使用 gdb 調(diào)試 init,會(huì)極大提高定位效率。
本文將詳細(xì)闡釋二次啟動(dòng)的標(biāo)準(zhǔn)系統(tǒng)如何使用 gdb 調(diào)試 init。
用 gdb 調(diào)試 init
①編譯出帶 debug 信息的調(diào)試版本
將 gdb 打包到系統(tǒng)鏡像中。init 不正常的情況下,系統(tǒng)無法正常啟動(dòng)工作,無法使用 hdc 工具加載 gdb 工具,所以直接在制作鏡像時(shí),將其打包到系統(tǒng)鏡像 bin 目錄下。
修改 deviceoardhihope k3568cfgBUILD.gn 打包腳本如下,注意保證 gdb 工具已放置在此本目錄下。

②調(diào)試版本鏡像帶符號(hào)
需要修改鏡像配置文件,修改其大小限制,尤其是 system.img,編譯失敗時(shí)不會(huì)提示實(shí)際鏡像大小,需要修改到 5G 以上。

③編譯調(diào)試版本,打開版本調(diào)試開關(guān)
./build.sh--product-name=XXX--gn-args="is_debug=trueuse_unstripped_as_runtime_outputs=true"
上述 debug 版本只能調(diào)試普通功能而不能調(diào)試 init,還需要對(duì) init 服務(wù)的源碼進(jìn)行部分適配修改,init 功能調(diào)試正常后,需將源碼恢復(fù)。
首先,在 init 掛載好 system、vendor 等鏡像,并將根目錄切換到 system 鏡像后。
在啟動(dòng)第二階段 init 時(shí),切換到 shell 下,停止 init 初始化流程,見下圖 B 處。

源碼詳見 basestartupinit servicesinitstandardinit.c。注意:A 處的 CloseStdio() 需要注釋掉。
考慮用 gdb 啟動(dòng) init 第二階段,init 絕大部分處理流程都在這一階段,從這里開始就可以用 gdb 調(diào)試了,init 第一階段處理相對(duì)而言流程簡(jiǎn)單一些,代碼走讀和調(diào)試打印基本就能解決問題。
在 init 主函數(shù)中去掉“不等于進(jìn)程 1 就返回的處理”,因?yàn)橛?gdb 起 init 第二階段時(shí),其進(jìn)程非 1。
源碼詳見basestartupinitservicesinitmain.c。

init 進(jìn)程中不初始化 Paramworkspace,前面 pid=1 的判斷,在 gdb 調(diào)試 init 時(shí)條件不成立,所以此處增加判斷 init 名就直接退出的處理。
源碼詳見 basestartupinitservicesparamaseparam_base.c。

做好了上述準(zhǔn)備,就可以用 gdb 調(diào)試 init。
把系統(tǒng)啟動(dòng),改造后的 init 初始化第一階段完成后,會(huì)停在 shell 下,此時(shí)使用下述命令啟動(dòng) init 第二階段。
gdb--args/bin/init--second-stage為了調(diào)試 init 的子進(jìn)程,還需要 gdb 下述命令:setfollow-fork-modechild

總結(jié)
本文章針對(duì) OpenHarmony 系統(tǒng)在調(diào)試 init 初始化流程時(shí),缺少高效的問題定位手段這一痛點(diǎn),引入了嵌入式系統(tǒng)開發(fā)的主流調(diào)試工具——gdb,詳細(xì)描述了這一方法涉及到的版本編譯、適配點(diǎn)修改以及調(diào)試命令操作等細(xì)節(jié)處理,指導(dǎo)開發(fā)者提高定位init問題的效率。
需要注意,當(dāng)前 gdb 調(diào)試 init 方法有局限,不適用輕量級(jí)系統(tǒng)、小型系統(tǒng)和一次啟動(dòng)的標(biāo)準(zhǔn)系統(tǒng)。
審核編輯:陳陳
-
gdb
+關(guān)注
關(guān)注
0文章
61瀏覽量
13881 -
init
+關(guān)注
關(guān)注
0文章
16瀏覽量
3695 -
OpenHarmony
+關(guān)注
關(guān)注
33文章
3952瀏覽量
21087
原文標(biāo)題:OpenHarmony上使用gdb調(diào)試init
文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
QEMU+GDB調(diào)試ARM程序
使用GDB調(diào)試Linux應(yīng)用程序
ubuntu下GDB調(diào)試GDB簡(jiǎn)介
OpenHarmony系統(tǒng)使用gdb調(diào)試init
OpenHarmony系統(tǒng)使用gdb調(diào)試launcher應(yīng)用程序
使用 GDB 調(diào)試多進(jìn)程程序
嵌入式Linux系統(tǒng)的GDB遠(yuǎn)程調(diào)試的實(shí)現(xiàn)
Linux應(yīng)用的GDB調(diào)試的原理及過程分析
OpenHarmony系統(tǒng)使用gdb調(diào)試init
ARM平臺(tái)如何玩轉(zhuǎn)GDB遠(yuǎn)程調(diào)試?
Linux系統(tǒng)GDB單步調(diào)試
GDB調(diào)試工具的原理
如何使用GDB調(diào)試工具
OpenHarmony系統(tǒng)如何使用gdb調(diào)試init
評(píng)論