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