簡體   English   中英

在 Linux 上跟蹤 libc 和系統調用函數調用?

[英]Trace libc and system call function calls on Linux?

我在 Linux 上有一個 C++ 應用程序。 在程序的整個執行過程中,我如何才能看到對malloc()等函數的庫調用,然后是對sbrk()等系統調用的調用?

我希望這能顯示哪些 libc 函數發生並負責后續的 Linux 系統調用。

注意:我不想攔截任何函數調用,只是記錄哪些 C 庫函數調用了哪些系統調用。

我希望這能顯示哪些 libc 函數發生並負責后續的 Linux sys 調用。

您可能想要使用ltrace(1)和/或strace(1)

當然閱讀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-CClang 靜態分析器

你也應該考慮使用Valgrind的,並與最近的GCC編譯器,使用一些消毒選項(如-fsanitize=address ),當然還有讓所有的警告和調試信息(因此也通過-Wall -Wextra -ggccg++ )。

並且您可以使用最新的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM