目录一、前言——ltrace 工具简介1.1 什么是 ltrace1.2 与 strace / gdb 的对比1.3 能跟踪什么、不能跟踪什么二、使用场景——何时使用 ltrace1、程序行为「像调了某个 API」但源码里找不到2、排查内存分配异常3、对比 strace:库函数层 vs 系统调用层4、定位第三方闭源 .so 的行为5、attach 已运行进程6、统计库函数调用频次(性能粗分析)三、核心原理——工作原理深度解析3.1 总体思路:拦截 PLT 跳转3.2 与 strace 的分工3.3 实现方式(概念级)3.4 性能影响四、命令参数——常用选项详解4.1 基本用法4.2 输出格式解读4.3 常用选项五、使用实战——实际案例分析案例 1:基础库函数跟踪案例 2:过滤跟踪,减少噪音案例 3:统计调用次数(-c)案例 4:attach 运行中的服务案例 5:跟踪指定动态库案例 6:带时间戳与耗时六、常见问题——疑难解答七、总结——要点回顾一、前言——ltrace 工具简介1.1 什么是 ltraceltrace(library trace)是 Linux 下的动态库函数调用跟踪工具,用于记录进程在运行时调用了哪些共享库(.so)中的函数,以及参数、返回值、耗时等信息。一句话定位:ltrace 是用户态程序的「库函数显微镜」—— 不用改代码、不用 gdb 单步,就能看清printf、malloc、fopen等 libc 调用链。1.2 与 strace / gdb 的对比工具跟踪对象典型输出典型场景ltrace库函数(libc、libpthread 等)malloc(128) = 0x...看业务代码调了哪些 APIstrace系统调用(内核接口)openat(...) = 3看文件/网络/进程 syscallgdb断点 + 单步 + 变量交互式调试已知崩溃点深入分析perfCPU 采样 / 计数热点函数栈性能瓶颈关系示意:你的代码: printf("hi") → fwrite(...) → write(1, ...) ↑ ltrace 看到 ↑ ltrace 可能看到 ↑ strace 看到ltrace 优势:直接对应C 标准库 / POSIX API,比 strace 更接近程序员日常写的函数名。1.3 能跟踪什么、不能跟踪什么能跟踪不能 / 难跟踪动态链接的 libc(glibc/musl)静态链接的 libc(-static)libpthread、libm、libdl 等 .so内联函数、编译器优化掉的调用通过 PLT 调用的外部符号无符号 / 被 strip 的私有 .so(名可能不全)子进程(-f)内核模块、内核态代码二、使用场景——何时使用 ltrace1、程序行为「像调了某个 API」但源码里找不到典型现象:日志里出现文件读写,但业务代码没有直接open怀疑第三方库在偷偷fopen/getenvltrace -e fopen+fopen64+open+openat ./app2、排查内存分配异常典型现象:内存持续增长,不确定谁在malloc怀疑某路径重复calloc未freeltrace -e malloc+free+realloc+calloc -f ./app 21 | tee mem.log3、对比 strace:库函数层 vs 系统调用层典型现象:strace看到大量write,不知道是printf还是fwrite需要把业务 API和底层 syscall对上号# 库函数层 ltrace -f ./app # 系统调用层 strace -f ./app # 同时看(部分版本支持) ltrace -S -f ./app4、定位第三方闭源 .so 的行为ltrace -l libvendor.so ./app # 或 ltrace -e '@libvendor.so' ./app5、attach 已运行进程ltrace -p $(pidof my_service)6、统计库函数调用频次(性能粗分析)ltrace -c ./app
深入linux c/c++调试工具之ltrace(库函数无处遁形)
发布时间:2026/7/14 4:29:58
目录一、前言——ltrace 工具简介1.1 什么是 ltrace1.2 与 strace / gdb 的对比1.3 能跟踪什么、不能跟踪什么二、使用场景——何时使用 ltrace1、程序行为「像调了某个 API」但源码里找不到2、排查内存分配异常3、对比 strace:库函数层 vs 系统调用层4、定位第三方闭源 .so 的行为5、attach 已运行进程6、统计库函数调用频次(性能粗分析)三、核心原理——工作原理深度解析3.1 总体思路:拦截 PLT 跳转3.2 与 strace 的分工3.3 实现方式(概念级)3.4 性能影响四、命令参数——常用选项详解4.1 基本用法4.2 输出格式解读4.3 常用选项五、使用实战——实际案例分析案例 1:基础库函数跟踪案例 2:过滤跟踪,减少噪音案例 3:统计调用次数(-c)案例 4:attach 运行中的服务案例 5:跟踪指定动态库案例 6:带时间戳与耗时六、常见问题——疑难解答七、总结——要点回顾一、前言——ltrace 工具简介1.1 什么是 ltraceltrace(library trace)是 Linux 下的动态库函数调用跟踪工具,用于记录进程在运行时调用了哪些共享库(.so)中的函数,以及参数、返回值、耗时等信息。一句话定位:ltrace 是用户态程序的「库函数显微镜」—— 不用改代码、不用 gdb 单步,就能看清printf、malloc、fopen等 libc 调用链。1.2 与 strace / gdb 的对比工具跟踪对象典型输出典型场景ltrace库函数(libc、libpthread 等)malloc(128) = 0x...看业务代码调了哪些 APIstrace系统调用(内核接口)openat(...) = 3看文件/网络/进程 syscallgdb断点 + 单步 + 变量交互式调试已知崩溃点深入分析perfCPU 采样 / 计数热点函数栈性能瓶颈关系示意:你的代码: printf("hi") → fwrite(...) → write(1, ...) ↑ ltrace 看到 ↑ ltrace 可能看到 ↑ strace 看到ltrace 优势:直接对应C 标准库 / POSIX API,比 strace 更接近程序员日常写的函数名。1.3 能跟踪什么、不能跟踪什么能跟踪不能 / 难跟踪动态链接的 libc(glibc/musl)静态链接的 libc(-static)libpthread、libm、libdl 等 .so内联函数、编译器优化掉的调用通过 PLT 调用的外部符号无符号 / 被 strip 的私有 .so(名可能不全)子进程(-f)内核模块、内核态代码二、使用场景——何时使用 ltrace1、程序行为「像调了某个 API」但源码里找不到典型现象:日志里出现文件读写,但业务代码没有直接open怀疑第三方库在偷偷fopen/getenvltrace -e fopen+fopen64+open+openat ./app2、排查内存分配异常典型现象:内存持续增长,不确定谁在malloc怀疑某路径重复calloc未freeltrace -e malloc+free+realloc+calloc -f ./app 21 | tee mem.log3、对比 strace:库函数层 vs 系统调用层典型现象:strace看到大量write,不知道是printf还是fwrite需要把业务 API和底层 syscall对上号# 库函数层 ltrace -f ./app # 系统调用层 strace -f ./app # 同时看(部分版本支持) ltrace -S -f ./app4、定位第三方闭源 .so 的行为ltrace -l libvendor.so ./app # 或 ltrace -e '@libvendor.so' ./app5、attach 已运行进程ltrace -p $(pidof my_service)6、统计库函数调用频次(性能粗分析)ltrace -c ./app