【问题标题】:Trace libc and system call function calls on Linux?在 Linux 上跟踪 libc 和系统调用函数调用?
【发布时间】:2014-07-28 11:43:35
【问题描述】:

我在 Linux 上有一个 C++ 应用程序。在整个程序执行过程中,如何查看库对函数(如malloc())的调用以及对系统调用(如sbrk() 等)的调用?

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

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

【问题讨论】:

    标签: c++ c linux unix


    【解决方案1】:

    我想显示哪些 libc 函数发生并负责后续的 Linux sys 调用。

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

    当然读syscalls(2)Advanced Linux Programming。或者使用ld.so(8) 技巧和dynamic linkers。你可以阅读Linkers and Loaders

    我相信使用所有警告和调试信息编译您的应用程序(例如g++ -Wall -Wextra -g应该会有所帮助(尤其是提供更好的输出)。您甚至可能想要安装一些系统库的调试变体(在 Debian 或 Ubuntu 上,像 libstdc++6-4.8-dbg 这样的软件包...)。

    仅当您认为已纠正大多数错误时,才在启用 optimizations 的情况下重新编译您的代码

    (这实际上意味着:add -O2g++ 程序选项,因此请适当配置您的 build automation 工具,例如,如果您使用 GNU make,请编辑您的 Makefile

    如果您在 2020 年使用最近的GCC 10,请考虑使用其static analyzer 选项。还可以考虑使用Frama-CClang static analyzer

    您还应该考虑使用valgrind 和最近的GCC 编译器,use 一些sanitizing 选项(例如-fsanitize=address)当然启用所有警告和DWARF 调试信息(所以也通过-Wall -Wextra -ggccg++)。

    您可以使用最近的GDB 调试器半自动跟踪某些函数,因为gdb may be scriptable 在 Python 或 Guile 中。

    另一种方法(参见this draft 报告)是编写您自己的GCC plugin,然后在编译您的一些或其他源代码时使用它。

    顺便说一句,要了解标准库是如何工作的(即它们正在调用哪个 syscalls),您不仅可以 strace 使用它们的程序,而且因为 Linux 上的许多库都是 free software 或 @ 987654347@,所以下载然后研究他们的源代码。我发现musl-libc 的源代码非常易读。另见更常见的Gnu libc。而C++标准库封装在GCC里面。

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

    【讨论】:

    • 这个答案很有启发性!它值得更多的支持。
    【解决方案2】:

    你可以从:

    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]
    

    【讨论】:

      【解决方案3】:

      对于系统调用,您可以使用 ltrace/strace 作为前面提到的答案。为了跟踪 libc 调用,您需要确定要跟踪哪些特定调用并创建一个使用 LD_PRELOAD 覆盖它们的库。

      有关如何执行此操作的详细信息,请参阅Create a wrapper function for malloc and free in C

      【讨论】:

      • 你打败了我,我想看看 new() -> malloc() 在 sbrk()/mmap() 等方面做了什么。
      猜你喜欢
      • 2023-03-11
      • 2015-07-02
      • 2012-04-03
      • 2016-05-09
      • 2017-01-04
      • 2012-09-27
      • 2014-03-20
      • 2011-08-02
      • 2021-04-27
      相关资源
      最近更新 更多