Heng30的博客
搜索 分类 关于 订阅

如何使用ltrace跟踪应用层程序调用系统库情况?

2025-04-01

ltrace是一个用于跟踪进程调用动态库函数的工具,主要用于调试和分析程序运行时与共享库(.so 文件)的交互情况。

功能

  • 动态库调用跟踪:显示程序调用的动态库函数(如libc中的 printf、malloc等),包括参数和返回值。

  • 系统调用跟踪(部分支持):通过-S选项可同时跟踪系统调用(类似strace的功能)。

  • 性能分析:统计函数调用次数和时间开销,帮助定位性能瓶颈。

基本用法

ltrace [选项] <可执行程序> [程序参数]

-p <PID>:附加到正在运行的进程。

-c:统计函数调用次数和时间,汇总输出。

-S:同时跟踪系统调用(需内核支持)。

-e <表达式>:只跟踪特定函数(如 -e malloc -e free)。

-o <文件>:将输出保存到文件。

示例

  • 跟踪简单程序:ltrace ./my_program
...
printf("Hello, %s\n", "World") = 13
malloc(100) = 0x12345678
...
  • 统计函数调用:ltrace -c ./my_program
% time     seconds  usecs/call     calls  function
------ ----------- ----------- --------- --------------------
...
50.0    0.001000         100        10   malloc
30.0    0.000600          60        10   printf
..
  • 跟踪特定函数:ltrace -e strcmp hostname
hostname->strcmp("hostname", "ypdomainname")                          = -17
hostname->strcmp("hostname", "domainname")                            = 4
hostname->strcmp("hostname", "nisdomainname")                         = -6
hostname->strcmp("hostname", "dnsdomainname")                         = 4

与strace的区别

  • ltrace:主要跟踪动态库函数调用(用户空间)。

  • strace:跟踪系统调用(内核空间),如文件操作、进程控制等。

适用场景

  • 调试动态库链接问题。

  • 分析程序性能瓶颈(如频繁调用的函数)。

  • 逆向工程时观察程序行为。

  • 注意:ltrace 依赖于动态库的符号表,对静态链接或高度优化的代码可能受限。