编程接口指南

解释 apptrace 输出

以下示例包含跟踪简单的单二进制应用程序 ls 所产生的 apptrace 输出样例。


示例 11–1 缺省跟踪行为


% apptrace ls /etc/passwd

ls       -> libc.so.1:atexit(func = 0xff3cb8f0) = 0x0

ls       -> libc.so.1:atexit(func = 0x129a4) = 0x0

ls       -> libc.so.1:getuid() = 0x32c3

ls       -> libc.so.1:time(tloc = 0x23918) = 0x3b2fe4ef

ls       -> libc.so.1:isatty(fildes = 0x1) = 0x1

ls       -> libc.so.1:ioctl(0x1, 0x540d, 0xffbff7ac)

ls       -> libc.so.1:ioctl(0x1, 0x5468, 0x23908)

ls       -> libc.so.1:setlocale(category = 0x6, locale = "") = "C"

ls       -> libc.so.1:calloc(nelem = 0x1, elsize = 0x40) = 0x23cd0

ls       -> libc.so.1:lstat64(path = "/etc/passwd", buf = 0xffbff6b0) = 0x0

ls       -> libc.so.1:acl(pathp = "/etc/passwd", cmd = 0x3, nentries = 0x0,

             aclbufp = 0x0) = 0x4

ls       -> libc.so.1:qsort(base = 0x23cd0, nel = 0x1, width = 0x40,

             compar = 0x12038)

ls       -> libc.so.1:sprintf(buf = 0x233d0, format = 0x12af8, ...) = 0

ls       -> libc.so.1:strlen(s = "") = 0x0

ls       -> libc.so.1:strlen(s = "/etc/passwd") = 0xb

ls       -> libc.so.1:sprintf(buf = 0x233d0, format = 0x12af8, ...) = 0

ls       -> libc.so.1:strlen(s = "") = 0x0

ls       -> libc.so.1:printf(format = 0x12ab8, ...) = 11

ls       -> libc.so.1:printf(/etc/passwd

format = 0x12abc, ...) = 1

ls       -> libc.so.1:exit(status = 0)

以上示例显示了缺省跟踪行为,即跟踪 ls /etc/passwd 命令的每个库调用。apptrace 实用程序针对每个系统调用列显一行输出,指明以下信息:

ls 的输出与 apptrace 输出混在一起。


示例 11–2 选择性跟踪


% apptrace -t \*printf ls /etc/passwd

ls       -> libc.so.1:sprintf(buf = 0x233d0, format = 0x12af8, ...) = 0

ls       -> libc.so.1:sprintf(buf = 0x233d0, format = 0x12af8, ...) = 0

ls       -> libc.so.1:printf(format = 0x12ab8, ...) = 11

ls       -> libc.so.1:printf(/etc/passwd

format = 0x12abc, ...) = 1

以上示例说明了 apptrace 如何能够有选择性地跟踪使用正则表达式语法的调用。在此示例中,在 printf(包括 sprintf)中结束的接口调用与以前一样,都是在 ls 命令中进行跟踪。 因此,apptrace 仅跟踪 printfsprintf 调用。


示例 11–3 详细跟踪


% apptrace -v sprintf ls /etc/passwd

ls       -> libc.so.1:sprintf(buf = 0x233d0, format = 0x12af8, ...) = 0

  buf =    (char *) 0x233d0 ""

  format = (char *) 0x12af8 "%s%s%s"

ls       -> libc.so.1:sprintf(buf = 0x233d0, format = 0x12af8, ...) = 0

  buf =    (char *) 0x233d0 ""

  format = (char *) 0x12af8 "%s%s%s"

/etc/passwd

以上示例显示了详细跟踪模式,在这种模式下,sprintf 的参数会列显在多行中以便于阅读。 最后,apptrace 会显示 ls 命令的输出。