手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

apptrace(1)

名称

apptrace - 跟踪对 Solaris 共享库的应用函数调用

用法概要

apptrace [-f] [-F [!] tracefromlist] [-T [!] tracetolist] 
     [-o outputfile] [ [-tv] [!] call ,...] command 
     [command arguments]

描述

apptrace 实用程序运行 command 所指定的可执行程序,并跟踪程序 command 对 Solaris 共享库所进行的所有函数调用。对于可跟踪的每个函数调用,apptrace 会报告所调用的库接口的名称、所传递的参数值以及返回值。

缺省情况下,apptrace 跟踪从可执行目标文件到所依赖的任何共享目标文件的直接调用。缺省情况下不报告间接调用(即可执行文件所依赖的共享目标文件之间的调用)。

可以使用 –F–T 选项(请参见下文)跟踪更多共享目标文件之间的调用。

缺省报告格式为每个调用一行,且不提供通过引用传递的参数以及数据结构的格式化输出。

可使用 –v 选项(请参见下文)获得提供更多参数详细信息的格式化输出。

缺省情况下,会跟踪共享目标文件所提供的每个接口(如果已调用)。但是,可以使用 –t 和/或 –v 选项限制要跟踪的接口组。

由于一般情况下可以跟踪在运行时链接的任何动态目标文件(可执行目标文件以及所依赖的任何共享目标文件)之间的调用,因此所跟踪的每个调用的报告将提供发出调用的目标文件名称。

apptrace 会跟踪动态目标文件之间通过过程链接表发生的所有过程调用,因此仅跟踪通过该表绑定的那些过程调用。请参见Oracle Solaris 11.2 链接程序和库指南

选项

支持以下选项:

–f

追踪 fork(2) 所创建的所有子项。此选项还将在每行的开头输出进程 ID。

–F [!]tracefromlist

跟踪从一个逗号分隔的共享目标文件列表发出的调用。仅跟踪从这些共享目标文件发出的调用。缺省值为仅跟踪从主可执行对象发出的调用。仅要求提供共享目标文件的基名。例如,libc 将匹配 /usr/lib/libc.so.1。此外,还支持 shell 样式通配符(如fnmatch(5) 中所述)。列表前面带有 "!" 表示不应跟踪从列表中目标文件发出的调用。如果要求跟踪从 command 发出的调用,则 command 必须是 tracefromlist 的成员。

–o outputfile

apptrace 输出将定向到 outputfile。缺省情况下,apptrace 输出放置在所跟踪的进程的标准错误流上。

–t [!]call, . . .

跟踪或排除函数调用。将跟踪逗号分隔列表 call 中指定的调用。如果列表以 ! 开头,将从跟踪输出中排除指定的函数调用。缺省值为 –t *。允许使用 shell 样式通配符。

–T [!]tracetolist

跟踪对逗号分隔的共享目标文件列表的调用。缺省值为跟踪对所有共享目标文件的调用。如上所述,只需提供基名,且允许使用通配符。列表前面带有 "!" 表示不应跟踪对列表中目标文件的调用。

–v [!]call, . . .

提供详细的格式化的参数输出,以及所指定的函数调用的返回值(如上面的 –t 选项中所述)。与 truss(1) 不同,–v 选项指定的调用无需再由 –t 选项指定。例如,apptrace –v open 等同于 truss –t open –v open

示例

示例 1 跟踪日期命令
% apptrace date
-> date     -> libc.so.1:atexit(0xff3bf9ac, 0x22000, 0x0) ** NR
-> date     -> libc.so.1:atexit(0x11550, 0xfefeef80, 0xab268) ** NR
-> date     -> libc.so.1:setlocale(0x6, 0x11560, 0x0) ** NR
-> date     -> libc.so.1:textdomain(0x11564, 0xfefce156, 0xff160200) ** NR
-> date     -> libc.so.1:int getopt(int = 0x1,
                        const char * * = 0xffbffa5c,
                        const char * = 0x11574 "a:u")
<- date     -> libc.so.1:getopt() = 0xffffffff
-> date     -> libc.so.1:time_t time(time_t * = 0x225c0)
<- date     -> libc.so.1:time() = 0x41ab6e82
-> date     -> libc.so.1:char * nl_langinfo(nl_item = 0x3a)
<- date     -> libc.so.1:nl_langinfo() = 0xfefd3e10
-> date     -> libc.so.1:struct tm * localtime(const time_t * = 0x225c0)
<- date     -> libc.so.1:localtime() = 0xff160240
-> date     -> libc.so.1:memcpy(0xffbff9cc, 0xff160240, 0x24) ** NR
-> date     -> libc.so.1:size_t strftime(char * = 0x225c4 "",
                        size_t = 0x400,
                        const char * = 0xfefd3e10 "%a %b %e %T %Z %Y",
                        const struct tm * = 0xffbff9cc)
<- date     -> libc.so.1:strftime() = 0x1c
-> date     -> libc.so.1:int puts(const char * = 0x225c4
                        "Mon Nov 29 10:46:26 PST 2004")
                        Mon Nov 29 10:46:26 PST 2004
<- date     -> libc.so.1:puts() = 0x1d
-> date     -> libc.so.1:exit(0x0, 0x22400, 0x0) ** NR
示例 2 跟踪设置了详细级别的特定接口组
% apptrace -v localtime,strftime,puts date
-> date     -> libc.so.1:struct tm * localtime(const time_t * = 0x225c0)
        arg0 = (const time_t *) 0x225c0
        return = (struct tm *) 0xff160280 (struct tm) {
        tm_sec: (int) 0x4
        tm_min: (int) 0x34
        tm_hour: (int) 0xa
        tm_mday: (int) 0x1d
        tm_mon: (int) 0xa
        tm_year: (int) 0x68
        tm_wday: (int) 0x1
        tm_yday: (int) 0x14d
        tm_isdst: (int) 0
        }
<- date     -> libc.so.1:localtime() = 0xff160280
-> date     -> libc.so.1:size_t strftime(char * = 0x225c4 "",
                        size_t = 0x400,
                        const char * = 0xfefd3e10 "%a %b %e %T %Z %Y",
                        const struct tm * = 0xffbff99c)
        arg0 = (char *) 0x225c4 ""
        arg1 = (size_t) 0x400
        arg2 = (const char *) 0xfefd3e10 "%a %b %e %T %Z %Y"
        arg3 = (const struct tm *) 0xffbff99c (struct tm) {
        tm_sec: (int) 0x4
        tm_min: (int) 0x34
        tm_hour: (int) 0xa
        tm_mday: (int) 0x1d
        tm_mon: (int) 0xa
        tm_year: (int) 0x68
        tm_wday: (int) 0x1
        tm_yday: (int) 0x14d
        tm_isdst: (int) 0
        }
        return = (size_t) 0x1c
<- date     -> libc.so.1:strftime() = 0x1c
-> date     -> libc.so.1:int puts(const char * = 0x225c4
                        "Mon Nov 29 10:52:04 PST 2004")
        arg0 = (const char *) 0x225c4 "Mon Nov 29 10:52:04 PST 2004"
                        Mon Nov 29 10:52:04 PST 2004
        return = (int) 0x1d
<- date     -> libc.so.1:puts() = 0x1d

** NR-不跟踪函数调用的返回值。

文件

Solaris 运行时链接程序 (ld.so.1(1)) 的链接审计功能提供了对 apptrace 的基本运行时支持,并且此工具对 apptrace 命令的使用依赖于保存在 /usr/lib/abi 中的一个审计目标文件 (apptrace.so.1)。

限制

限制

通常,apptrace 无法跟踪对接受变量参数列表的函数的调用。在某些情况下,可通过一些巧妙的编码来解决此问题,尤其是在 printfscanf 系列中。

apptrace 实用程序无法跟踪返回类型为 structunion 的函数调用的返回值。

无法跟踪试图探测栈或提取调用者相关信息的函数。例如,[gs]etcontext()[sig]longjmp()[sig]setjmp()vfork()

对于 exit(2) 等不会返回的函数,不会跟踪其返回值。

为安全起见,只有具有相应特权的进程可以使用 apptrace 跟踪 setuid/setgid 程序。

在跟踪需要包含 <varargs.h> 才能使用的函数(例如 vwprintw(3XCURSES)vwscanw(3XCURSES))时,将不会提供参数的格式化输出。

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
developer/appcert(32 位)
SUNWcstlx(64 位)
接口稳定性
Uncommitted(未确定)

另请参见

ld.so.1(1)truss(1)vwprintw(3XCURSES)vwscanw(3XCURSES)attributes(5)fnmatch(5)

Oracle Solaris 11.2 链接程序和库指南