c程序调试命令
ltrace
是 Linux 系统中一款强大的调试工具,用于跟踪程序调用的 库函数 和 系统调用,并打印函数的参数和返回值。它类似于 strace
,但更专注于用户态的库函数调用(如 C 标准库函数 printf
、malloc
等)。
strace
:跟踪进程的系统调用(如open
、read
)和信号,用于调试IO问题。
基本用法
ltrace [选项] 程序名 [程序参数]
常用选项
选项 | 功能描述 |
---|---|
-c | 统计每个函数的调用次数、耗时等信息,程序结束后输出汇总报告 |
-f | 跟踪子进程(跟随 fork 创建的子进程) |
-p <PID> | 附加到正在运行的进程(通过进程 ID 跟踪) |
-s <长度> | 设置字符串参数的最大显示长度(默认 32 字节) |
-t / -tt / -ttt | 在输出中添加时间戳(-t 精确到秒,-tt 毫秒,-ttt 微秒级 Unix 时间戳) |
-e <表达式> | 过滤跟踪的函数(如只跟踪 printf 或排除 malloc ) |
-o <文件> | 将输出重定向到文件(而非终端) |
实际示例
1. 跟踪简单程序的库函数调用
创建测试程序 test.c
:
#include <stdio.h>
#include <string.h>int main() {char str[20];strcpy(str, "hello");printf("Length: %d\n", strlen(str));return 0;
}
编译并使用 ltrace
跟踪:
gcc test.c -o test
ltrace ./test
输出结果(展示库函数调用流程):
strcpy(0x7ffd9b9c3a30, "hello") = 0x7ffd9b9c3a30
strlen("hello") = 5
printf("Length: %d\n", 5) = 10
+++ exited (status 0) +++
2. 统计函数调用次数和耗时(-c
)
ltrace -c ./test
输出统计报告:
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------0.00 0.000000 0 1 strcpy0.00 0.000000 0 1 strlen0.00 0.000000 0 1 printf0.00 0.000000 0 1 __libc_start_main
------ ----------- ----------- --------- --------------------
100.00 0.000000 4 total
3. 过滤特定函数(-e
)
- 只跟踪
printf
函数:ltrace -e printf ./test
- 排除
strcpy
函数(只跟踪其他函数):ltrace -e '!strcpy' ./test
4. 跟踪正在运行的进程(-p
)
假设进程 test
的 PID 为 1234:
ltrace -p 1234
5. 跟踪子进程(-f
)
对于会创建子进程的程序(如 bash
脚本),使用 -f
跟踪所有子进程:
ltrace -f sh -c 'echo hello; ls'
与 strace
的区别
ltrace
:主要跟踪 用户态库函数(如libc
中的函数)。strace
:主要跟踪 内核系统调用(如open
、read
、write
)。
根据调试需求选择:若需分析程序与库的交互,用 ltrace
;若需分析程序与内核的交互,用 strace
。
通过 ltrace
,可以快速定位程序在库函数调用中出现的问题(如参数错误、返回值异常等),是排查程序逻辑错误和性能问题的实用工具。