1. 準備調(diào)試串口
目標板一般只有一個串口用于控制臺輸入輸出咕宿,串口遠程調(diào)試需要第二個串口笆制。下面假設這個串口設備是/dev/ttyS2叫搁。同時假設宿主機上的串口設備是/dev/ttyS1匈仗。
- 檢查串口連通性。在宿主機上執(zhí)行:
$ cat /dev/ttyS1
在板上執(zhí)行:
$ echo hello > /dev/ttyS2
這時宿主機上應收到hello悍手。如果收到證明宿主機RX方向沒有問題帘睦。
類似地,反過來檢查確認宿主機TX方向沒有問題坦康。
- 如果宿主機上的Linux不是直接裝在本機上竣付,而是Windows上的虛擬機(如VMware),則虛擬機需要添加串口涝焙。VWware的設置方法如下圖:
一般串口1的設備號是/dev/ttyS0卑笨,串口2的設備號是/dev/ttyS1 ... 可以用前面的方法驗證連通性。
2. 檢查 gdb + gdbserver
- 軟件布局
這里的設置影響動態(tài)庫符號的加載仑撞。假設你的軟件包mypkg.tar.gz的布局如下:
mypkg/lib
mypkg/bin
在板上安裝在/opt目錄下:
/opt/mypkg
在宿主機上解壓在/home/ronzheng下
/home/ronzheng/opt/mypkg
- 連接gdbserver
在板上運行如下命令赤兴,gdbserver應當顯示進程啟動信息。為了顯示后來的連接信息隧哮,這里打開了選項
--remote-debug桶良。
$ cd /opt/mypkg/bin
$ gdbserver --remote-debug /dev/ttyS2 myapp
Process myapp created; pid = 23466
Remote debugging using /dev/ttyS2
在宿主機上運行如下命令,gdb應當從本地加載符號信息沮翔。其中9600是/dev/ttyS1的波特率陨帆。
$ cd /home/ronzheng
$ arm-linux-gnueabi-gdb -b 9600 opt/pos/bin/myapp
...
Reading symbols from extp/pos/bin/msghub...done.
繼續(xù)設置sysroot,以便找到動態(tài)庫的符號信息:
(gdb) set sysroot /home/aronzheng
在main()設置斷點:
(gdb) b main
連接串口target采蚀,這時板上的gdbserver應該打印一系列連接信息疲牵。
(gdb) target remote /dev/ttyS1
Remote debugging using /dev/ttyS1
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0xb6fd7a00 in ?? ()
運行continue,這時gdb應該停在main()函數(shù)上榆鼠。
(gdb) continue
warning: Could not load shared library symbols for 10 libraries, e.g. /lib/librt.so.1.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
Breakpoint 1, main (argc=1, argv=0xbefffd74) at /home/ronzheng/dev/mypkg/apps/myapp/src/MyApp.cpp:10
這時就可以開始調(diào)試了纲爸。
也可以用info sharedlib檢查動態(tài)庫的符號加載情況。
(gdb) info sharedlib
From To Syms Read Shared Object Library
0xb6fc5b1c 0xb6fc6180 Yes /home/ronzheng/opt/pos/lib/libappfrm.so
0xb6fb06c0 0xb6fb340c Yes /home/ronzheng/opt/pos/lib/libmsgend.so
No /lib/librt.so.1
No /lib/libdl.so.2
0xb6f7300c 0xb6f73ad0 Yes /home/ronzheng/opt/pos/lib/libtlog.so
0xb6f1ba50 0xb6f5957c Yes /home/ronzheng/opt/pos/lib/libnanomsg.so.5.1.0
No /lib/libstdc++.so.6
No /lib/libm.so.6
No /lib/libgcc_s.so.1
No /lib/libpthread.so.0
No /lib/libc.so.6
No /lib/ld-linux.so.3
No /usr/lib/extra/libanl.so.1
No /lib/libnsl.so.1
- 切換root用戶
連接串口target時妆够,可能出現(xiàn)權(quán)限不夠的情況:
(gdb) target remote /dev/ttyS1
/dev/ttyS1: Permission denied.
這時需要先切換到root用戶:
$ sudo passwd root
$ su
3. 正式調(diào)試
去掉gdbserver的--remote-debug選項识啦,重新開始調(diào)試。
$ gdbserver /dev/ttyS2 myapp
相關(guān)鏈接
GDB 常用法
GDB 調(diào)試Coredump問題
嵌入式開發(fā)中GDB調(diào)試Coredump問題
嵌入式開發(fā)中GDB串口遠程調(diào)試
用backtrace()調(diào)試coredump問題
Valgrind memcheck 用法
Address Sanitizer 用法
參考資料
arm-linux-gdb + gdbserver雙串口目標機調(diào)試心得
http://blog.sina.com.cn/s/blog_48ca560d0100ej6t.html
ubuntu怎么切換到root用戶,切換到root賬號方法
https://jingyan.baidu.com/article/fd8044fa1e74035031137ae0.html