ltrace是专用于监控用户空间程序共享库函数调用的动态追踪工具,支持基础追踪、正则过滤、日志记录、系统调用关联及进程附加五种核心用法。

如果您希望分析程序运行时调用的共享库函数及其参数和返回值,则需要借助动态链接库级别的追踪工具。ltrace 是专用于监控用户空间程序对共享库函数调用的命令行工具,它通过拦截动态链接器的符号解析过程实现函数调用捕获。以下是使用 ltrace 追踪库函数调用的具体方法:
一、基础用法:直接追踪可执行文件
ltrace 默认启动目标程序并实时显示其所有外部库函数调用,包括函数名、参数和返回值。该方式适用于无复杂环境依赖的独立二进制程序。
1、打开终端,确保目标程序已安装且具备可执行权限。
2、输入命令:ltrace ./program_name,其中 program_name 为待分析的可执行文件名。
3、观察输出中每一行的格式:函数名(参数列表) = 返回值,例如 printf("Hello") = 6 表示成功打印6个字符。
二、限定库函数范围:使用 -e 选项过滤
当程序调用大量库函数导致输出冗长时,可通过 -e 参数指定正则表达式匹配目标函数或库,减少无关信息干扰,提升分析效率。
1、运行命令:ltrace -e "malloc|free" ./program_name,仅显示 malloc 和 free 的调用过程。
2、若需匹配特定库中的函数,使用语法:ltrace -e "@libc.so.6:read" ./program_name,限制为 libc 中的 read 函数。
3、支持通配符,例如 ltrace -e "str*" ./program_name 将捕获所有以 str 开头的函数调用。
三、记录到文件:避免终端刷屏丢失信息
长时间运行或高频率调用场景下,终端输出易被覆盖,将结果重定向至文件可保留完整调用序列,便于后续逐行比对与审计。
1、执行命令:ltrace -o trace.log ./program_name,所有输出写入当前目录下的 trace.log 文件。
2、若需同时查看屏幕输出并保存日志,使用:ltrace ./program_name 2>&1 | tee trace.log。
3、检查日志完整性:wc -l trace.log 确认行数,tail -n 20 trace.log 查看末尾调用片段。
四、关联符号调试:结合 -S 选项显示系统调用辅助定位
ltrace 本身不追踪内核系统调用,但启用 -S 选项后可在库函数调用前后插入对应系统调用(如 mmap、brk),帮助识别内存分配等底层行为与库函数的映射关系。
1、运行命令:ltrace -S ./program_name,输出中系统调用以 <syscalls> 标识,与库函数调用交替出现。
2、注意:-S 输出包含大量低层细节,建议配合 -e 限定关注路径,例如:ltrace -S -e "malloc" ./program_name。
3、识别关键节点:当 malloc 返回 NULL 时,向前查找最近的 mmap 或 brk 失败记录,可判断是否因资源耗尽导致分配失败。
五、调试已运行进程:附加到正在执行的 PID
对于无法重启或需观测长期服务行为的场景,ltrace 支持 attach 模式,直接绑定至目标进程 ID,实时捕获后续库函数调用流。
1、获取目标进程 PID:ps aux | grep program_name 或 pidof program_name。
2、执行附加命令:ltrace -p PID_NUMBER,例如 ltrace -p 12345。
3、附加成功后,ltrace 将持续输出新发生的库调用,按 Ctrl+C 可中断追踪但不终止原进程。

















