環境:Blackfin uClinux(版本:buildroot-2012R1-RC6-BF60X)
Linux主機:ubuntu 10.04.4
可以通過串口和網路兩種方式進行調試,以下樣本以網路調試為例。
1. 在Linux主機編譯應用程式:bfin-uclinux-gcc–g –o0 –o a.out test.c
-g :在可執行檔中加入調試資訊,才能使GDB正常工作;
-o0 :將最佳化等級設定為0,以便於調試。
2. 在超級終端上將編譯好的可執行檔a.out拷貝到uClinux根目錄下:
ftpget -u joey -p 123456 192.168.1.159 a.out/mnt/hgfs/uClinux-code/ABC3000_src/a.out
賦予a.out可執行檔許可權:
chmod a+x a.out
在uClinux下啟動gdbserver:
gdbserver localhost:3456 a.out(3456是連接埠,只要不與其它應用衝突,可改成任意連接埠)
3. 在Linux主機下面執行:bfin-uclinux-gdb a.out.gdb(a.out.gdb在編譯時間產生)
當GDB在主機下運行起來後,執行以下命令串連目標系統,即uClinux:
target remote 192.168.1.122:3456(192.168.1.122是uClinux的IP地址)
到了這一步,就可以進行調試了:
--------------------------------------------------------------------------------------------------------
以下表格是常用的GDB命令:
命令 |
效果 |
開始與停止 |
|
quit |
退出GDB |
run |
運行程式(後面可以開命令列參數) |
kill |
停止程式 |
斷點 |
|
break sum |
在函數sum的入口處設定斷點 |
break *0x80483c3 |
在地址0x80483c3處設定斷點 |
delete 1 |
刪除第1個斷點 |
delete |
刪除所有斷點 |
執行 |
|
stepi |
執行一條指令(逐語句,會進入函數) |
stepi n |
執行n條指令(逐語句) |
nexti |
類似於stepi(逐過程,不會進入函數) |
continue |
繼續執行 |
finish |
運行至當前函數返回 |
檢查代碼 |
|
disas |
反組譯碼當前函數 |
disas sum |
反組譯碼函數sum |
disas 0x80483b7 |
反組譯碼地址0x80483b7附近的代碼 |
disas 0x80483b7 0x80483c7 |
反組譯碼兩地址之間的代碼 |
print /x $pc |
以十六進位形式列印程式計數器 |
list |
列出原始碼 |
list n |
列出第n行附近的原始碼 |
檢查資料 |
|
print $r0 |
以十進位列印r0的值 |
print /x $r0 |
以十六進位列印r0的值 |
print /t $r0 |
以二進位列印r0的值 |
print 0x100 |
列印0x100的十進位形式 |
print /x 1024 |
列印1024的十六進位形式 |
print /t 1024 |
列印1024的二進位形式 |
print /x ($pc+8) |
以十六進位形式列印寄存器pc內容+8 |
print *(int *) 0xbffff890 |
列印地址0xbfffff890中的整數 |
print *(int *) ($pc +8) |
列印地址%pc+8中的整數 |
有用的資訊 |
|
info frame |
當前棧楨的資訊 |
info registers |
所有寄存器的資訊 |
help |
擷取GDB的資訊 |
更詳細的內容請見:http://docs.blackfin.uclinux.org/doku.php?id=debuggers&s[]=gdb