第21章 Linux裝置驅動的除錯之strace

2021-08-20 16:32:45 字數 1473 閱讀 4604

21.8 strace

在linux系統中,strace是一種相當有效的跟蹤工具,strace的主要特點是可以被用來監視系統呼叫。不僅可以用strace除錯乙個新開始的程式,也可以除錯乙個已經在執行的程式(這意味著把strace繫結到乙個已有的pid上)。對於第6章的globalmem字元裝置檔案,以strace方式執行如**清單21.8所示的使用者空間應用程式globalmem_test(使用gcc命令編譯globalmem_test.c檔案 gcc globalmem_test.c -o test),以strace ./test的方式執行結果如下:

execve("./globalmem_test", ["./globalmem_test"], [/* 24 vars */]) = 0

...open("/dev/globalmem", o_rdwr)        = 3   /* 開啟的/dev/globalmem的fd是3 */

ioctl(3, fibmap, 0)                  = 0

read(3, 0xbff17920, 200)           = -1 enxio (no such device or address)/* 讀取失敗 */

fstat64(1, ) = 0

mmap2(null, 4096, prot_read|prot_write, map_private|map_anonymous, -1, 0) = 0xb7f04000

write(1, "-1 bytes read from globalmem\n", 29-1 bytes read from globalmem

) = 29                           /* 向標準輸出裝置(fd為1)寫入printf中的字串 */

write(3, "this is a test of globalmem", 27) = 27

write(1, "27 bytes written into globalmem\n", 3227 bytes written into globalmem

) = 32

...輸出的每一行對應一次linux系統呼叫,其格式為「左邊=右邊」,等號左邊是系統呼叫的函式名及其引數,右邊是該呼叫的返回值。

**清單21.8 使用者空間應用程式globalmem_test

#include ...

#define mem_clear 0x1

void main(void)

}使用strace雖然無法直接追蹤到裝置驅動中的函式,但是足以幫助工程師進行推演:

如從open(「/dev/globalmem」,o_rdwr)=3的返回結果知道/dev/globalmem的fd為3,之後對fd為3的檔案進行read()、write()和ioctl()系統呼叫,最終會使globalmem裡file_operations中的相應函式被呼叫,通過系統呼叫的結果就可以知道驅動中globalmem_read()、globalmem_write()和globalmem_ioctl()的執行結果。

第1章Linux裝置驅動簡介二

1.2 劃分核心 在 unix 系統中,幾個併發的程序專注於不同的任務.每個程序請求系統資源,比如計算能力,記憶體,網路連線,或者一些別的資源.核心是個大塊的可執行檔案,負責處理所有這樣的請求.儘管不同核心任務間的區別常常不是能清楚劃分,核心的角色可以劃分成下列幾個部分 如圖1.1 1 程序管理 核...

第1章 裝置驅動概述

本文摘自 偶有較小改動 linux 裝置驅動開發詳解 宋寶華 編著 人民郵電出版社 留作紀念。living park 第1章 裝置驅動概述 1.1 裝置驅動的作用 沒有硬體的軟體是空中樓閣,而沒有軟體的硬體則是一堆廢鐵。計算機系統的軟硬體互相成就了對方。對裝置驅動最通俗的解釋就是 驅動硬體裝置行動 ...

第19章 Flash裝置驅動

本文摘自 偶有較小改動 linux 裝置驅動開發詳解 宋寶華 編著 人民郵電出版社 留作紀念。living park 第19章 flash裝置驅動 19.1 linux flash驅動結構 19.1.1 linux mtd系統層次 在linux系統中,提供了mtd memory technology...