[英]Trace libc and system call function calls on Linux?
我在 Linux 上有一個 C++ 應用程序。 在程序的整個執行過程中,我如何才能看到對malloc()
等函數的庫調用,然后是對sbrk()
等系統調用的調用?
我希望這能顯示哪些 libc 函數發生並負責后續的 Linux 系統調用。
注意:我不想攔截任何函數調用,只是記錄哪些 C 庫函數調用了哪些系統調用。
我希望這能顯示哪些 libc 函數發生並負責后續的 Linux sys 調用。
當然閱讀syscalls(2)和Advanced Linux Programming 。 或者對動態鏈接器使用ld.so(8)技巧。 你可以閱讀鏈接器和加載器
我相信使用所有警告和調試信息(例如g++ -Wall -Wextra -g
)編譯您的應用程序應該會有所幫助(特別是提供更好的輸出)。 你甚至可能想要安裝一些系統庫的調試變體(在 Debian 或 Ubuntu 上,像libstdc++6-4.8-dbg
等包......)。
(這實際上意味着:將-O2
添加到g++
程序選項,因此適當地配置您的構建自動化工具,例如,如果您使用GNU make則編輯您的Makefile
)。
如果您在 2020 年使用最新的GCC 10 ,請考慮使用其靜態分析器選項。 還可以考慮使用Frama-C或Clang 靜態分析器。
你也應該考慮使用Valgrind的,並與最近的GCC編譯器,使用一些消毒選項(如-fsanitize=address
),當然還有讓所有的警告和矮調試信息(因此也通過-Wall -Wextra -g
到gcc
或g++
)。
並且您可以使用最新的GDB調試器半自動地跟蹤某些函數,因為gdb
可以在 Python 或 Guile 中編寫腳本。
另一種方法(參見這份報告草案)是編寫你自己的GCC 插件,然后在編譯你的一些或其他源代碼時使用它。
順便說一句,要了解標准庫的工作原理(即它們正在調用哪些系統調用),您不僅可以strace
使用它們的程序,而且由於Linux 上的許多庫都是免費軟件或開源的,所以下載然后研究它們的源代碼。 我發現musl-libc的源代碼非常易讀。 另請參閱更常見的Gnu libc 。 並且 C++ 標准庫被封裝在GCC 中。
有關系統方法,請閱讀LinuxFromScratch 。 只要有足夠的耐心(數周的工作),您就可以編譯所有 Linux 軟件(或使用基於源代碼的發行版,例如Gentoo )。
你可以從:
man ld-linux
export LD_DEBUG=help
示例我想知道 ls 命令使用什么樣的函數:
export LD_DEBUG=symbols
export LD_DEBUG_OUTPUT=myoutput.txt
[xxxx@localhost ~]$ ls -l
total 244
-rw-rw-r-- 1 xxxxx pppppp 247 Jul 15 12:05 28_29storage.txt
現在在文件 myoutput.txt.pidnumber 我有:
13419: symbol=malloc; lookup in file=ls [0]
13419: symbol=malloc; lookup in file=/lib64/libselinux.so.1 [0]
13419: symbol=malloc; lookup in file=/lib64/libcap.so.2 [0]
13419: symbol=malloc; lookup in file=/lib64/libacl.so.1 [0]
13419: symbol=malloc; lookup in file=/lib64/libc.so.6 [0]
對於系統調用,您可以使用 ltrace/strace 作為前面提到的答案。 為了跟蹤 libc 調用,您需要決定要跟蹤哪些特定調用並創建一個使用 LD_PRELOAD 覆蓋它們的庫。
有關如何執行此操作的詳細信息,請參閱在 C 中為 malloc 和 free 創建包裝函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.