編譯選項: -g
# gdb
(gdb) run <沒有設定breakpoint的話,程式會一直執行到結束>
(gdb) start <在main設置暫時中斷點,並開始執行程式>
(gdb) next <執行下一行指令,func call會被當作一行指令,不會進去func執行(over)>
(gdb) step <執行下一行指令,連function都會進去一行一行執行(into)>
(gdb) continue <繼續執行,直到下一個中斷點或是程式停止>
(gdb) return <視同該frame已執行完畢>
(gdb) quit <離開gdb>
(gdb) attach [PID] <載入正在執行的程式以進行除錯>
(gdb) detach <釋放已 attach 的程式>
➠ Breakpoint
(gdb) breakpoint [file:]function <在function函式下中斷點>
(gdb) info break <列出目前所有的中斷點>
(gdb) delete [num] <移除第num個中斷點>
➠ Frame
所有的程式,每一個 function 都會被分配到一個 frame ,每個 frame 都是一個 組語 stack ,存放所有組語指令,然後再一行一行的執行,例如當程式執行到 printf 這個 function 的時候,就會進入該 printf frame 。
正在執行的函式就是 frame 0,而呼叫該函式的函式就是 frame 1,以此類推
(gdb) backtrace <顯示出所有的frame的資訊>
(gdb) frame <顯示現在的行數、函式、及其所傳送的參數>
(gdb) frame [num] <切換至指定的frame(以印出區域變數)>
(gdb) up <回到上一層frame>
(gdb) down <到下一層frame>
(gdb) finish <執行完目前的frame>
(gdb) jump [location] <直接跳到指定位置(行數、函式...)>
(gdb) info frame <詳細的frame資訊>
➠ Thread
(gdb) info thread <看thread號碼>
(gdb) thread <查看目前在哪個thread>
(gdb) thread [num] <切換至第num個thread>
(gdb) info locals <顯示目前執行函式內所有區域變數的值>
(gdb) print/format [variable] <看某變數的數值>
format: d-整數; u-無號整數; o-八進位; t-二進位; a-位址; c-字元; f-浮點數
(gdb) print "%d,%d\n",var1,var2 <一次印出兩個以上的變數>
(gdb) print arr[1]@5 <印出變數arr[1]和之後的變數,共印出5個(arr[1]~arr[5])>
(gdb) print *arr@3 <印出陣列arr的前3個變數(arr[0]~arr[2])>
(gdb) whatis [variable] <顯示指定變數的型態>
(gdb) ptype [variable] <顯示class, struct的定義內容>
(gdb) display [variable] <持續顯示指定變數>
(gdb) undisplay [num] <停止顯示指定變數>
(gdb) x/[num]bx [variable] <顯示變數的記憶體的HEX>
➠ Watch
(gdb) watch [variable] <觀察變數被更改時,會中斷程式,並印出更改前後的值>
(gdb) rwatch [variable] <觀察變數被讀取時,會中斷程式,並印出更改前後的值>
(gdb) awatch [variable] <觀察變數被讀取/更改時,會中斷程式,並印出更改前後的值>
(gdb) watch [variable > num] <觀察變數是否大於num>
(gdb) info watch <顯示所有的watchpoint>
(gdb) list <列出現在執行的位置上下5行>
(gdb) list [function] <列出某函式的程式碼>
➠ Info
(gdb) info line <查看程式目前運行的行數>
(gdb) info args <顯示傳給目前執行函式的參數值>
(gdb) info reg <顯示register的值>
(gdb) info handle <列出目前處理signal的設定>
(gdb) info share <顯示共享函式庫資訊>
info proc -- Show /proc process information about any running process
info program -- Execution status of the program
info sharedlibrary -- Status of loaded shared object libraries
info types -- All type names
info source -- Information about the current source file
info set -- Show all GDB settings
➠ Assemble
(gdb) disass [function] <印出某函式的組語>
(gdb) disass /m [function] <印出某函式的組語與程式碼內容>
(gdb) disass /r [function] <把組語的內容用HEX的方式印出來>
➠ GDB dashboard
https://github.com/cyrus-and/gdb-dashboard
$ wget -P ~ git.io/.gdbinit
# gdb ./examples/kni/build/app/kni
>>> dashboard -layout source assembly threads stack registers expressions memory history
>>> dashboard -output /dev/pts/3
>>> set args -c 0xFFFFF -n 4 -- -P -p 0x3 --config="(0,0,1),(1,2,3)"
>>> br kni_ingress
>>> run
>>> x/32bx pkts_burst[0]
>>> dashboard memory watch 0x7fffc924ea00 100
dashboard memory -output -- Set the output file/TTY for both the dashboard and modules
dashboard memory clear -- Clear all the watched regions
dashboard memory unwatch -- Stop watching a memory region by address
dashboard memory watch -- Watch a memory region by address and length
參考資料
http://gitqwerty777.github.io/gdb-introduction/
http://www.study-area.org/cyril/opentools/opentools/x1265.html
沒有留言:
張貼留言