、安裝gdb,下載地址:http://ftp.gnu.org/gnu/gdb/ ,注意這里的configure命令中的target和host參數(shù),必須和編譯器一致
編譯gdbserver,在解壓縮后的gdb目錄下,如果是交叉編譯器arm-unknown-linux-gnueabi-gcc,gdbserver的configure中的
--host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab
gdb的configure參數(shù)--targe=arm-unknown-linux-gnueabi,host不用
2、編譯程序,必須加-g參數(shù)
3、nfs掛載遠(yuǎn)程文件目錄到本地或是拷貝gdbserver到遠(yuǎn)程
4、啟動(dòng)gdbserver 格式:gdbserver localhost:端口號(hào) 程序名
5、遠(yuǎn)程調(diào)試:gdb -p 程序名
執(zhí)行遠(yuǎn)程鏈接:
(gdb) target remote 遠(yuǎn)端ip:gdbserver的端口號(hào)
開始調(diào)試
注意事項(xiàng):
程序運(yùn)行如果需要加載動(dòng)態(tài)庫,在gdb調(diào)試時(shí)需要手動(dòng)加載這些動(dòng)態(tài)庫。gbd使用用info share命令查看動(dòng)態(tài)庫加載情況
(gdb)info share
手動(dòng)加載動(dòng)態(tài)庫指令:
(gdb) set solib-search-path + 需要加載的動(dòng)態(tài)庫路徑。
如果每次都要加載相關(guān)庫可以在~目錄下新建一個(gè).gdbinit文件,并將“set solib-search-path + 需要加載的動(dòng)態(tài)庫路徑”寫入其中,gdb每次啟動(dòng)會(huì)加載這個(gè)配置文件。
常用命令:thread apply all bt //打印所有線程堆棧
info threads //當(dāng)前所有線程信息
thread ID //切換到置定線程
thread apply ID1 ID2 command //多個(gè)線程執(zhí)行command命令
set scheduler-locking off|on|step off 不鎖定任何線程,也就是所有線程都執(zhí)行,這是默認(rèn)值。 on 只有當(dāng)前被調(diào)試程序會(huì)執(zhí)行。 step 在單步的時(shí)候,除了next過一個(gè)函數(shù)的情況(熟悉情況的人可能知道,這其實(shí)是一個(gè)設(shè)置斷點(diǎn)然后continue的行為)以外,只有當(dāng)前線程會(huì)執(zhí)行。
break thread_test.c:123 thread all 在所有線程中相應(yīng)的行上設(shè)置斷點(diǎn)
show scheduler-locking,查看當(dāng)前鎖定線程的模式
繼續(xù)使某一線程運(yùn)行:thread apply 1-n(第幾個(gè)線程)
查看進(jìn)程:info inferiors
只運(yùn)行當(dāng)前線程
1. 設(shè)置:set scheduler-locking on
2. 運(yùn)行:n
//查看主線程和新線程的關(guān)系
pstree -p 主線程id