天天看點

GDB技巧分享,讓你的調試變得更友善1 TUI模式2 常用指令中蘊藏的小技巧

GDB是我們在嵌入式程式調試時最常使用到的調試工具,有關GDB的文章,網上早已經層出不窮。這邊會分享一些GDB調試上的小技巧,也許會讓大家再重新認識一下這個很熟悉的工具,也希望能讓大家的調試能夠更加友善。

1 TUI模式

大家在IDE工具,如CDS、CDK、Keil中可以通過源代碼對照着進行調試,非常友善。那gdb中有沒有方法,能讓大家也對照着源碼進行調試呢。有,那就是tui模式。 在gdb指令行中輸入tui enable即可進入tui模式 當然還有更快捷的方式,直接輸入Ctrl-X A即可直接進入tui模式

GDB技巧分享,讓你的調試變得更友善1 TUI模式2 常用指令中蘊藏的小技巧

Tui模式中預設顯示的是代碼的源碼,此時如果輸入上和下按鍵,不再會顯示之前或者之後的gdb指令,而是在tui圖形框中上下移動,此時如果需要進行指令前後翻閱,是通過Ctrl+p/n來進行的

調試的時候,如果還想檢視目前代碼對應的彙編指令,則可以通過輸入Ctrl+X 2,這樣立馬會顯示出目前代碼行對應的彙編指令來

GDB技巧分享,讓你的調試變得更友善1 TUI模式2 常用指令中蘊藏的小技巧

如果使用者想檢視目前的寄存器狀态時,再次輸入Ctrl+X 2,則可顯示目前的寄存器狀态,預設為通用寄存器

GDB技巧分享,讓你的調試變得更友善1 TUI模式2 常用指令中蘊藏的小技巧

如果不想檢視通用寄存器的,隻想看控制寄存器的,則輸入tui reg cr即可切換為控制寄存器的顯示 輸入tui reg,gdb會顯示可以使用的所有寄存器模式,如gpr、cr、bank3等

GDB技巧分享,讓你的調試變得更友善1 TUI模式2 常用指令中蘊藏的小技巧

注:通過輸入Ctrl+X 2可在源代碼界面、彙編界面、寄存器界面間不斷的切換,gdb不支援Ctrl+X 3同時顯示所有三個界面 另外,輸入Ctrl-l可進行TUI頁面的重新整理

2 常用指令中蘊藏的小技巧

2.1 command

break指令是大家在調試時最常使用的指令之一,每當觸發到斷點時,也是調試人員最忙碌的時候,查變量查記憶體,分析可能導緻缺陷的原因。當同一個斷點可能會多次被觸發時,command指令将是你調試時的利器。command指令是配合斷點進行使用的,如目前已設定過斷點,斷點号為1,則可以通過輸入command 1為斷點設定後續的一系列執行指令,比如檢視某片記憶體中的值

GDB技巧分享,讓你的調試變得更友善1 TUI模式2 常用指令中蘊藏的小技巧

如上圖,每次在斷點處停下來時,gdb都會順手列印出在記憶體0x2000起的4個word的值。

2.2 backtrace

backtrace也是大家在調試時最常用使用的指令之一,但一般大家都是僅用其來檢視調用的函數幀,其實backtrace中也蘊藏着其他寶藏,首先我們先輸入bt,效果大緻如下圖:

GDB技巧分享,讓你的調試變得更友善1 TUI模式2 常用指令中蘊藏的小技巧

大家能看到bt資訊的左邊,有列數字,這個數字,可以通過執行frame N的方式退回到當時函數幀的情況,利用之前學習到的tui模式,往往有很好的效果。 我們先通過Ctrl+x a打開tui

GDB技巧分享,讓你的調試變得更友善1 TUI模式2 常用指令中蘊藏的小技巧

此時再輸入frame 1,即可退回到原benchmark_dhry_main函數中調用Proc_2的地方

GDB技巧分享,讓你的調試變得更友善1 TUI模式2 常用指令中蘊藏的小技巧

通過執行frame指令跳轉到對應函數幀時,通過i r檢視到的寄存器值,就是執行到該對應函數時的寄存器值,對于調試是非常有幫助的哦

bt還有個很友善的功能,可以将各個函數幀中局部變量的值給列印出來 在gdb指令行中輸入bt full,即可檢視

GDB技巧分享,讓你的調試變得更友善1 TUI模式2 常用指令中蘊藏的小技巧

2.3 thread apply

多線程調試時,thread是最常使用的指令之一,但調試人員一般都會将thread當成是線程切換的指令,其實利用thread apply可以做的事情還有很多哦,通過thread apply能夠做到不切換也一樣能對其他線程進行操控 比如我希望對所有線程都執行bt,就可以輸入指令thread apply all bt 如果我隻希望對線程2執行i r r0的操作,則可以通過輸入指令thread apply 2 i r r0 如果是希望對線程1到4執行i r r1的操作,則可以通過輸入指令thread apply 1-4 i r r0

以上就是我這邊對gdb這邊的一些分享,不知道是否有幫助到你了呢?

本文作者:wangxf

點選檢視原文