天天看點

應用調試之使用strace指令跟蹤系統調用

一、安裝:

1、解壓:tar xvf strace-4.5.15.tar.bz2  

2、打更新檔:cd strace-4.5.15

                     patch -p1 < ../strace-fix-arm-bad-syscall.patch

---是原來的檔案,+++是修改後的檔案,+是添加的代碼,要加參數把第1個斜杠前的

内容去掉,才能找到要給哪一個檔案打更新檔。-p1這裡的數字1是從更新檔檔案裡面吧第1

個斜杠前的内容去掉,就可以打哪一個檔案。

3、配置:./configure --host=arm-linux CC=arm-linux-gcc

//--host=arm-linux表示程式編譯出來後在arm上的linux系統上運作

//CC表示編譯器

4、編譯:make

5、拷貝:将strace檔案拷貝到開發闆根檔案系統的bin目錄下

二、實驗

 (1)安程式,直接輸入strace+回車檢視使用

(2)用strace跟蹤調用(可以知道應用程式運作過程中調用了哪一些系統調用函數)

把生成的log.text拷貝到PC端分析,這裡fd=3,把數值\1\0\0\0寫到檔案3裡面去,寫4位元組。

這裡val值為1,涉及open和write調用

三、原理說明

strace主要用于跟蹤系統調用,那麼是如何跟蹤的呢?我們來分析一下:

首先strace會作為一個父程序,而被跟蹤的系統調用作為子程序,我們用open函數來

舉個例子:

我們知道在使用者空間的open函數,它會調用一個swi指令加上一個值,這個指令會導緻

一個異常,然後進入核心态,在這個異常處理函數裡面就會根據那個值找到并調用

sys_open這個函數,下面我們就來好好的來看一個這個異常處理函數:

首先在核心裡搜尋:vector_swi,找到:

ENTRY(vector_swi)

@測試本系統調用是被跟蹤,如果被跟蹤的話就調用:__sys_trace

tstip, #_TIF_SYSCALL_TRACE @ are we tracing syscalls?

bne__sys_trace

          syscall_trace

這個函數用于向父程序,也就是strace發送一個信号,等待strace反應後才會繼續往下

執行。

我們來總結一下:

strace作為父程序去調用open函數,open函數會産生一個異常然後進入到核心裡面,

在核心裡面首先檢查該系統調用沒有有被跟蹤,如果被跟蹤的話就會向strace發送一個

信号,并等待回應,strace收到信号之後就可以把相應的資訊記錄下來并且給出應答,

系統調用收到應答之後繼續執行!

四、移植:busybox-1.20.0并且使用strace解決問題

1、到官網下載下傳:http://www.busybox.net/downloads/

2、解壓:tar xvf busybox-1.20.0.tar.bz2

3、配置:cd busybox-1.20.0

                 make menuconfig

4、配置選項添加交叉編譯工具:arm-linux-

Busybox Settings  --->

         Build Options  --->

Cross  Compiler prefix(NEW) --->

添加交叉編譯工具字首:arm-linux-

5、編譯:make

6、解決錯誤:

錯誤1:

miscutils/ionice.c:23: error: `SYS_ioprio_set' undeclared (first use in this function)

解決方法:将ionice選項去掉

(1)make menuconfig

(2)輸入"/",進入到搜尋框

(3)在搜尋框裡面輸入:ionice,回車

(4)會列出ionice選項的位置

(5)找到ionice選項并去除選中

(6)儲存退出,并且執行:make

錯誤2:

miscutils/nandwrite.c:64: error: dereferencing pointer to incomplete type

解決方法:将nandwrite,nanddump選項去掉

方法同上

錯誤3:

miscutils/ubi_tools.c:67:26: mtd/ubi-user.h: No such file or directory

解決方法:将ubi開頭的選項都去掉

方法同上

現在編譯成功了

7、用新編譯出來的busybox替換本來根檔案系統的busybox

先備份舊的busybox

把新編譯的busybox拷貝過來

8、重新開機開發闆,挂載新的根檔案系統

檢視busybox版本,替換成功

9、我們加載驅動:insmod first_drv.ko

解除安裝驅動的時候出現錯誤:

rmmod first_drv

rmmod: chdir(/lib/modules): No such file or directory

解決方法:

(1)strace -o log.txt rmmod first_drv

(2)看log.txt檔案的結尾:

chdir("/lib/modules")                   = -1 ENOENT (No such file or directory)

提示沒有/lib/modules

于是我們建立:mkdir /lib/modules

再次解除安裝:rmmod first_drv

還有錯誤:rmmod: chdir(2.6.22.6): No such file or directory

解決方法:

(1)strace -o log.txt rmmod first_drv

(2)看log.txt檔案的結尾:

chdir("2.6.22.6")                       = -1 ENOENT (No such file or directory)

于是我們 建立:mkdir /lib/modules/2.6.22.6

解除安裝成功!

繼續閱讀