ltrace默认不预装,需手动安装;它仅跟踪动态链接程序的库函数调用,对静态链接、内联函数及stripped二进制无效。

ltrace 默认不预装,必须手动安装;它只对动态链接程序有效,静态链接、内联函数、stripped 二进制会大量漏报或显示地址而非函数名。
怎么装 ltrace?不同发行版命令不一样
Debian/Ubuntu:sudo apt-get install ltrace
CentOS/RHEL 7 及以前:sudo yum install ltrace
CentOS/RHEL 8+ 或 Fedora:sudo dnf install ltrace
Arch Linux:sudo pacman -S ltrace
macOS 和 Windows 原生不支持,WSL 可用,macOS 上可考虑 dtruss 替代
为什么 ltrace 运行了却没输出?常见静默原因
多数不是工具坏了,而是被默认过滤或进程逃逸了:
- 目标程序是静态链接:先跑
ldd ./your_program,没输出一堆libxxx.so就别硬用 ltrace - libc 函数被编译器内联(比如
strlen、memcpy小数据时),ltrace 捕不到 - 程序 fork 子进程后,默认只跟踪父进程,加
-f才能穿透 - 字符串参数被截断:加
-s 256避免关键路径或 URL 看不见 - 启动即退出:用
ltrace -e '*' ./your_program强制显示所有符号,排除过滤干扰
怎么精准筛选要跟踪的库函数?-e 参数的真实行为
-e 不是白名单,而是子串匹配 + shell 通配,容易误判:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
-e "malloc"会同时匹配malloc、realloc、memalign,因为符号名含malloc字串 - 真实符号带版本后缀,如
malloc@GLIBC_2.34,写-e "malloc"可能不生效,得查objdump -T /lib/x86_64-linux-gnu/libc.so.6 | grep malloc后写成-e "malloc@GLIBC_*" - 屏蔽干扰日志:
-e "!printf|!fprintf";只盯 I/O:-e "read|write|open|connect|send|recv" - 大小写敏感:
-e "memcpy"不会捕获MemCpy或memcpy@GLIBC_2.14,后者需写-e "memcpy*"
和 strace 一起用时,顺序和选项怎么配?
不能嵌套执行 strace ltrace 或 ltrace strace,两者都依赖 ptrace,嵌套直接失效:
- 推荐分两次跑:一次
ltrace -f -e "connect|send|recv" ./client,一次strace -f -e trace=connect,sendto,recvfrom ./client,对比调用上下文 - 若真要单次混合输出,可用
ltrace -S(注意:它只把系统调用作为辅助信息穿插在库调用流里,粒度粗,且无法用-e过滤系统调用) - 两者都涉及 fork 多次的场景,
-f对双方都必要,否则 PID 切换后就断连
真正难的不是命令敲对,而是看懂哪些调用根本不会出现——比如 Go 编译的默认静态二进制、Rust 的 no_std 程序、或者 strip 掉符号表的发布版,这时候 ltrace 输出全是地址,得立刻切到 readelf -d 或 file 先确认 ELF 属性和链接方式。










