在 Linux 上跟踪 libc 和系统调用函数调用?

use*_*112 4 c c++ unix linux

我在 Linux 上有一个 C++ 应用程序。在程序的整个执行过程中,我如何才能看到对函数的库调用malloc(),然后是系统调用,例如sbrk()等等?

我希望这能显示哪些 libc 函数发生并负责后续的 Linux 系统调用。

注意:我不想拦截任何函数调用,只是记录哪些 C 库函数调用了哪些系统调用。

Bas*_*tch 7

我希望这能显示哪些 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......)。

仅当您认为已更正大多数错误时,才重新编译启用优化的代码

(这实际上意味着:添加 -O2g++程序选项,因此适当地配置您的构建自动化工具,例如,Makefile如果您使用GNU make则编辑您的)。

如果您在 2020 年使用最新的GCC 10,请考虑使用其静态分析器选项。还可以考虑使用Frama-CClang 静态分析器

您还应该考虑使用valgrind,并在最近的GCC编译器中使用一些清理选项(例如-fsanitize=address),当然还要启用所有警告和DWARF调试信息(因此也传递-Wall -Wextra -ggccg++)。

并且您可以使用最新的GDB调试器半自动地跟踪某些函数,因为它gdb可以在 Python 或 Guile 中编写脚本

另一种方法(参见这份报告草案)是编写你自己的GCC 插件,然后在编译你的一些或其他源代码时使用它。

顺便说一句,要了解标准库的工作原理(即它们正在调用哪些系统调用),您不仅可以strace使用它们的程序,而且由于Linux 上的许多库都是免费软件开源的,所以下载然后研究它们的源代码。我发现musl-libc的源代码非常易读。另请参阅更常见的Gnu libc。并且 C++ 标准库被封装在GCC 中

有关系统方法,请阅读LinuxFromScratch。只要有足够的耐心(数周的工作),您就可以编译所有 Linux 软件(或使用基于源代码的发行版,例如Gentoo)。


c4f*_*t0r 5

你可以从:

man ld-linux
export LD_DEBUG=help
Run Code Online (Sandbox Code Playgroud)

示例我想知道 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
Run Code Online (Sandbox Code Playgroud)

现在在文件 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]
Run Code Online (Sandbox Code Playgroud)