ltrace 是 Linux 系统中的一个实用工具,用于跟踪和记录程序运行时调用的动态库函数。它是调试和分析程序行为的强大工具,特别适合以下场景:
与 strace 命令(跟踪系统调用)不同,ltrace 专注于用户空间的库函数调用。
大多数 Linux 发行版默认不安装 ltrace,可以使用包管理器安装:
ltrace 的基本命令
格式为:
ltrace [选项] 要跟踪的程序 [程序参数]
或者附加到正在运行的进程:
ltrace -p PID
| 选项 | 说明 |
|---|---|
| @@######@@ | 统计函数调用次数和时间,最后输出汇总信息 |
| @@######@@ | 只跟踪指定的函数(支持通配符) |
| @@######@@ | 跟踪子进程 |
| @@######@@ | 打印指令指针(IP) |
| @@######@@ | 只跟踪指定库中的函数 |
| @@######@@ | 指定输出行的缩进级别 |
| @@######@@ | 将输出写入文件 |
| @@######@@ | 附加到正在运行的进程 |
| @@######@@ | 打印相对时间戳 |
| @@######@@ | 同时跟踪系统调用 |
| @@######@@ | 在每行前添加时间 |
| @@######@@ | 显示每次调用的耗时 |
| @@######@@ | 以指定用户身份运行 |
跟踪一个简单程序的库函数调用:
-c
输出示例:
-e
使用
-f选项获取函数调用的统计信息:
-i
输出示例:
-l
只跟踪
-n和
-o函数:
-p
跟踪 PID 为 1234 的进程:
-r
使用
-S选项显示每次调用的耗时:
-t
输出示例:
-t
-u
通过这个命令,你可以看到程序的内存分配和释放模式,帮助发现内存泄漏或过度分配问题。
ltrace ./my_program
这可以帮助你了解网络程序如何与套接字交互,查看连接参数和数据传输情况。
printf("Hello, World!n") = 13
malloc(1024) = 0x55a1a2e2e260
free(0x55a1a2e2e260) =
结合
-c和
ltrace -c ./my_program选项,可以找出程序中最耗时的库函数调用。
使用 grep 过滤 ltrace 输出:
% time seconds usecs/call calls function ------ ----------- ----------- --------- -------------------- 45.23 0.123456 123 1000 malloc 32.12 0.087654 87 1000 free 22.65 0.061728 61 1000 printf
使用
malloc选项同时跟踪系统调用和库函数:
free
使用
ltrace -e "malloc,free" ./my_program控制缩进,
ltrace -p 1234添加时间戳:
-t
只跟踪 libcrypto 库中的函数:
ltrace -T ./my_program
可能原因:
C++ 的函数名会被修饰(mangled),可以使用
malloc(1024) = 0x55a1a2e2e260 free(0x55a1a2e2e260) =选项尝试解码:
ltrace -e "malloc,free" ./memory_intensive_program
或者使用 c++filt 工具解码输出。
ltrace -e "connect,send,recv" ./network_program选项将输出保存到文件便于分析
ltrace 是 Linux 开发者工具箱中不可或缺的工具,它提供了观察程序运行时行为的独特视角。通过掌握 ltrace,你可以:
建议读者在自己的项目上实践 ltrace 的各种用法,逐步掌握这个强大的调试工具。
ltrace -c -T ./performance_critical_program
-c
-t
ltrace ./my_program 2>&1 | grep "interesting_function"
-S
ltrace -S ./my_program
-n
-t
ltrace -n 2 -ttt ./my_program
ltrace -l libcrypto.so ./my_program
-c
ltrace -C ./cpp_program
-o