一、常規調試方法:
(1)Printf和串口,在有終端的情況下使用printf打印調試;
(2)Led,在硬件上使用led作爲程序的調試,查看程序的運行情況;
二、查詢法:
獲取有關文件系統支持,可用內存,CPU,運行程序的內核狀態等信息 例如:查詢 /proc 文件系統。
(1)/proc/cmdline -> 內核命令行
(2)/proc/cpuinfo -> 關於處理器的品牌,型號信息等
(3)/proc/filesystems -> 文件系統的內核支持的信息
(4)/proc/<pid>/cmdline -> 命令行參數傳遞到當前進程
(5)/proc/<pid>/mem -> 當前進程持有的內存
(6)/proc/<pid>/status -> 當前進程的狀態
三、跟蹤法:
strace的和ltrace是兩個在Linux中用來追蹤程序的執行細節的跟蹤工具。
1.Strace:系統調用
用來監控用戶空間進程和內核的交互,比如攔截和記錄系統調用 、信號傳遞、進程狀態變更等。
它顯示了系統調用、傳遞給它們的參數和返回值。當發現進程或服務異常時,我們可以通過strace來跟蹤其系統調用,“看看它在幹啥”,進而找到異常的原因 (更多的是用在運維的問題診斷)
工具的好處是不需要源代碼,程序也不需要重新編譯。
2.Ltrace:進程調用庫函數的情況
首先ltrace打開elf文件,對其進行分析。在elf文件中,出於動態連接的需要,需要在elf文件中保存函數的符號,供連接器使用。 這樣一來ltrace就能夠獲得該文件中所有函數調用的符號,以及對應的執行指令。然後ltrace將該指令所對應的4個字節替換成斷點。 這樣在進程執行到相應的庫函數後,就可以通知到了ltrace,ltrace將對應的庫函數打印出來之後,繼續執行子進程。
常用指令:'-i' 選項在調用庫時打印指令指針; '-S' 選項被用來現實系統調用和庫調用。
實際上ltrace與strace使用的技術大體相同,但ltrace在對支持fork和clone方面,不如strace;strace在收到frok和clone等系統調用後,做了相應的處理,而ltrace沒有。
四、Valgrind調試分析工具:
多用於檢測內存泄漏、重釋放、訪問越界、使用未初始化的內存、內存讀寫越界(訪問了不該訪問或者沒有權限訪問的地址空間,動態內存訪問時超出了申請的大小範圍)、內存覆蓋、使用已經釋放了的內存等。
但是它增加了內存佔用,會減慢程序。有時會造成誤報和漏報。不能檢測出靜態分配的數組的訪問越界問題。
常見的命令:valgrind --tool=memcheck --leak-check=full ./test
五、GDB:
給用戶以控制權而去執行各種動作,例如:啓動程序、停止在規定的位置、在指定條件下停止、檢查所需要的信息、改變程序中的數據等。
1.原理:
(1)pc機:用GDB來調試ARM板上的程序,gdb程序需要帶有調試信息的app文件;
(2)arm:有一個父進程gdbserver,這個gdbserver再去訪問app內存空間 。
2.安裝步驟:
(1)pc機安裝gdb的步驟:
(2)編譯GBD和gdbserver
(3)源碼的下載:http://ftp.gnu.org/gnu/gdb/
(4)以下的所有目錄在你解壓之後打開的gdb源碼目錄中完成
tar xjf gdb...
gdb-7.4/
./configure --target=arm-linux
make
mkdir tmp
make install prefix=$PWD/tmp
cp /tmp/bin/arm-linux-gdb /bin
(5)把arm-linux-gdb複製到/bin目錄。
3.開發板安裝的步驟:(將編譯好的工具放在nfs的掛載目錄下,然後開發板就可以使用)
cd ./gdb/gdbserver
./configure --host=arm-linux
cp gdbserver /home/zdh128/nfs_dir/rootfs_aston
將拷過來的gdbserver文件放在開發板的/usr/bin 目錄下 (庫文件放在bin目錄下)。
4.調試:
編譯:編譯要調試的應用,編譯時加上-g選項,-g選項就是要加上一個調試信息。
arm-linux-gcc -g -o test_debug test_debug.c
cp test_debug /home/zdh128/nfs_dir/rootfs_aston/
(1)在ARM板上:gdbserver 192.168.1.129:2345 ./test_debug
(2)在pc上:/bin/arm-linux-gdb ./test_debug
輸入: target remote 192.168.1.129:2345
然後:使用gdb命令來控制程序
輸入l:查看源碼
輸入break 打斷點 break main 在main裏面打斷點
輸入c:continue
break test_debug.c:31 在31行打斷點
(3)通過core dump文件直接分析錯誤,進行調試:讓程序在開發板上直接運行當他發生錯誤時,令它產生core dump文件然後使用gdb來根據core dump文件找到發生錯誤的地方。
①ulimit -c unlimited 不限制產生core dump文件的大小
②執行應用程序,錯誤發生時在當前目錄下產生了名爲core 的core dump文件。
在pc上: cp /work/nfs_root/../core . /bin/arm-linux-gdb ./test_debug ./core