Linux
讀取 /proc 時如何找出正在執行的函式
我正在嘗試編寫一個核心模組來隱藏一些來自 netstat 的套接字。我檢查了 netstat 是如何工作的,發現它是從
/proc/net/tcp
.現在我被困住了。我試圖弄清楚當我閱讀
/proc/net/tcp
文件時發生了什麼。在Google進行了一些研究後,我發現它正在使用tcp4_seq_show
函式。我的問題是如何在不使用Google搜尋的情況下找出使用了哪個功能?
我嘗試使用 strace 像 -
strace -y -yy -v cat /proc/net/tcp
但輸出不包含對該
tcp4_seq_show
函式或任何其他核心函式的任何引用。相關輸出 -
arch_prctl(ARCH_SET_FS, 0x7ff5ec3e1580) = 0 mprotect(0x7ff5ec3d6000, 12288, PROT_READ) = 0 mprotect(0x55c369b3b000, 4096, PROT_READ) = 0 mprotect(0x7ff5ec420000, 4096, PROT_READ) = 0 munmap(0x7ff5ec3e2000, 71701) = 0 brk(NULL) = 0x55c36a40e000 brk(0x55c36a42f000) = 0x55c36a42f000 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=5698896, ...}) = 0 mmap(NULL, 5698896, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff5ebc7f000 close(3) = 0 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0 openat(AT_FDCWD, "/proc/net/tcp", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0 mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff5ebc5d000 read(3, " sl local_address rem_address "..., 131072) = 900 write(1, " sl local_address rem_address "..., 900 sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 0: 00000000:0915 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 69736 1 ffff9f59772fc600 100 0 0 10 0 1: 3500007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000 102 0 31698 1 ffff9f59772f9a40 100 0 0 10 0 2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 38399 1 ffff9f5972c3a300 100 0 0 10 5 3: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 38548 1 ffff9f5972c3b480 100 0 0 10 0 4: 0100007F:A879 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 44812 1 ffff9f59772fd780 100 0 0 10 0 ) = 900 read(3, "", 131072) = 0 munmap(0x7ff5ebc5d000, 139264) = 0 close(3) = 0 close(1) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++
也嘗試使用
ltrace
,但它返回一個空輸出……那麼如何在不了解所有核心且不使用Google搜尋的情況下確定使用了哪個函式呢?
我認為您不能簡單地使用使用者空間工具來跟踪核心呼叫。您可能正在尋找的是
ftrace
,那麼您可以(如果您的核心支持它)執行以下操作:sysctl kernel.ftrace_enabled=1 echo function_graph > /sys/kernel/debug/tracing/current_tracer echo 1 > /sys/kernel/debug/tracing/tracing_on cat /proc/net/tcp echo 0 > /sys/kernel/debug/tracing/tracing_on less /sys/kernel/debug/tracing/trace
有關閱讀時發生的更多資訊
/proc/net/tcp
,您可以下載核心源文件和/或閱讀核心文件,例如。關於虛擬文件系統、 /proc和seq_file介面。由於
/proc
文件系統是向使用者空間提供系統資訊的核心功能,因此我不知道是否可以隱藏套接字netstat
(參見如何編輯 /proc/net/tcp?)。