2017年10月2日 星期一

gdb除錯工具

GDB (Global Project DeBug): 1. Debug 2.反組譯 3.Hack執行檔
編譯選項: -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>

➠ Print

(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>

➠ List
(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

沒有留言:

張貼留言