Книга: Embedded Linux Primer: A Practical, Real-World Approach
13.4.3. ltrace
13.4.3. ltrace
The ltrace and strace utilities are closely related. The ltrace utility does for library calls what strace does for system calls. It is invoked in a similar fashion: Precede the program to be traced by the tracer utility, as follows:
$ ltrace ./example
Listing 13-7 reproduces the output of ltrace on a small example program that executes a handful of standard C library calls.
Listing 13-7. Example ltrace Output
$
ltrace ./example
__libc_start_main(0x8048594, 1, 0xbffff944, 0x80486b4, 0x80486fc <unfinished ...>
malloc(256) = 0x804a008
getenv("HOME") = "/home/chris"
strncpy(0x804a008, "/home", 5) = 0x804a008
fopen("foo.txt", "w") = 0x804a110
printf("$HOME = %sn", "/home/chris"$HOME = /home/chris
) = 20
fprintf(0x804a110, "$HOME = %sn", "/home/chris") = 20
fclose(0x804a110) = 0
remove("foo.txt") = 0
free(0x804a008) = <void>
+++ exited (status 0) +++
$
For each library call, the name of the call is displayed, along with varying portions of the parameters to the call. Similar to strace, the return value of the library call is then displayed. As with strace, this tool can be used on programs for which source code is not available.
As with strace, a variety of switches affect the behavior of ltrace. You can display the value of the program counter at each library call, which can be helpful in understanding your application's program flow. As with strace, you can use -c to accumulate and report count, error, and time statistics, making a useful simple profiling tool. Listing 13-8 displays the results of our simple example program using the -c option.
Listing 13-8. Profiling Using ltrace
$ ltrace -c ./example
$HOME = /home/chris
% time seconds usecs/call calls function
------ ----------- ----------- --------- ----------------
24.16 0.000231 231 1 printf
16.53 0.000158 158 1 fclose
16.00 0.000153 153 1 fopen
13.70 0.000131 131 1 malloc
10.67 0.000102 102 1 remove
9.31 0.000089 89 1 fprintf
3.35 0.000032 32 1 getenv
3.14 0.000030 30 1 free
3.14 0.000030 30 1 strncpy
------ ----------- ----------- --------- ----------------
100.00 0.000956 9 total
The ltrace tool is available only for programs that have been compiled to use dynamically linked shared library objects. This is the usual default, so unless you explicitly specify -static when compiling, you can use ltrace on the resulting binary. Again similar to strace, you must use an ltrace binary that has been compiled for your target architecture. These utilities are run on the target, not the host development system.