我在Linux上有一个C ++应用程序。在整个程序执行过程中,如何查看对malloc()
等函数的库调用,然后再查看sbrk()
等系统调用?
我希望这能显示出现了哪些libc函数并负责后续的Linux sys调用。
注意:我不想拦截任何函数调用,只是为了记录哪个C库函数调用哪个sys调用。
答案 0 :(得分:2)
我认为用所有警告和调试信息(例如g++ -Wall -g
)编译应用程序应该会有所帮助(特别是提供更好的输出)。你甚至可以安装一些系统库的调试版本(在Debian或Ubuntu上,像libstdc++6-4.8-dbg
这样的包等...)
您还应该考虑使用valgrind,并使用最近的GCC编译器,使用一些清理选项(例如-fsanitize=address
)
您可以使用最近的gdb
跟踪某些函数,因为它可以在Python中编写脚本。
strace
使用它们的程序,而且因为Linux上的大多数标准库都是免费软件,研究他们的源代码。我发现musl-libc的源代码非常易读。另请参见更常见的Gnu libc。 C ++标准库打包在GCC内。
答案 1 :(得分: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]
答案 2 :(得分:1)
对于系统调用,您可以使用ltrace / strace作为前面提到的答案。为了跟踪libc调用,您需要确定要跟踪的特定调用,并创建一个使用LD_PRELOAD来覆盖它们的库。
有关如何执行此操作的详细信息,请参阅Create a wrapper function for malloc and free in C。