CGDB入門
GDB是一套好用的debug工具,而CGDB則是基於GDB的功能,在介面上分成了指令區和程式碼顯示區兩塊,所以CGDB和GDB的用法是一樣的,更貼切地說,CGDB只是加了程式碼顯示區域的GDB。
這份文件會以”對在qemu上跑的Linux kernel做debug的動作”為範例做說明。
1. 安裝,使用CGDB
安裝使用apt-get即可:
#apt-get install CGDB
因為我們所要debug的對象是屬於arm架構下,所以必須使用toolchain所提供的CGDB:
#cgdb –d arm-none-linux-gnueabi-gdb
2. QEMU開啟GDB mode
在QEMU開機的script中,要加上-S -s的參數,這個參數會讓QEMU的控制交給GDB,下了這個參數會讓QEMU開機過程卡住,等到GDB有執行的指令才會開始動。
3. GDB連線到QEMU
要debug就必須要先將GDB所在的terminal連線到QEMU所在的terminal,GDB預設的port是1234,在GDB裡面打入:
#target remote :1234
4. GDB載入symbol file
GDB是依據所載入的symbol file來顯示debug的相關資訊,包含程式執行到哪一行、所有register所儲存的東西、變數內容等。在我們編kernel的時候,在kernel source code所在的跟目錄下會伴隨產生vmlinux這個檔案,file是用來載入symbol file的指令,後面接著symbol file所在的路徑和檔案名稱,例如:
#file linux/vmlinux
5. 使用GDB script
先編輯一個簡單的script叫做gdbscript內容為:
target remote :1234
file linux/vmlinux
cgdb沒有提供讀script檔案的參數,但是GDB有,在CGDB指令的最後放上雙減號"--",這代表CGDB指令的結束,所以接在雙減號之後就是給GDB看的參數,我們在加上-x參數導入script:
#cgdb –d arm-none-linux-gnueabi-gdb -- -x gdbscript
這樣打開CGDB之後就會自動把port接起來並且載入symbol file了。
6. GDB指令
(1) continue
讓程式繼續跑下去,直到停在breakpoint。
(2) Breakpoint
程式執行到這裡就會停下來,並且會顯示目前執行到code的哪裡
a. Add breakpoint
Breakpoint可以設定在function、程式的某一行、記憶體位址
#breakpoint schedule
#breakpoint kernel/sched.c:5430
b. Enable breakpoint
設定的breakpoint不一定就一定要生效,預設是enable的狀態,如果要把一個breakpoint enable,指令打:
#enable
c. Disable breakpoint
#disable
d. Clear breakpoint
清除breakpoint,後面接著行號或是function名稱
#clear test.c:1234
#clear schedule
e. Delete breakpoint
刪除breakpoint,後面接著breakpoint流水號
#delete
f. Conditional breakpoint
可以加上條件來決定某個中斷點在執行的時候要不要停下來
#condition
(3) next
執行下一行程式碼,但是遇到function不會進去function裡面。
(4) step
執行下一行程式碼,遇到function會進去逐行跑,所以這個指令是會把整任何程式碼徹底地跑過。
(5) list
顯示目前停下來的點是被誰呼叫的。
(6) print
印出變數內的值,可以加入/x以十六進位顯示,或是/d以十進位顯示。
#print /x var
(7) info
顯示很多有用的資訊,包含register、memory位置都可以。
#info r
(8) backtrace
可以看出使用GDB時在那些地方停下來過。
(9) disassemble
呈現出目前的組合語言程式碼
7. 指令縮寫:
指令 | 縮寫 |
backtrace | bt |
breakpoint | b |
condtion | cond |
continue | c |
diable | dis |
disassemble | disas |
enable | en |
Info | i |
list | l |
next | n |
| p |
step | s |
GDB的縮寫原則是,只要指令的前幾個字元可以辨別出是哪個指令,就可以當縮寫,舉例:list的縮寫可以是l, li, lis, list。
8. CGDB上下區域的切換
在CGDB按下Esc會focus到上面的顯示code區域,這個時可以按下+或-來調整顯示code區域的大小,也可以Page Up和Page Down來移動,按下i會回到下面才可以打指令,
沒有留言:
張貼留言