常見的應用調試方法

一、常規調試方法:

(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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章