一、安裝:
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
解除安裝成功!