跳过导航链接 | |
退出打印视图 | |
![]() |
手册页第 1 部分:用户命令 Oracle Solaris 11.1 Information Library (简体中文) |
- 跟踪对 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 会跟踪动态目标文件之间通过过程链接表发生的所有过程调用,因此仅跟踪通过该表绑定的那些过程调用。请参见《链接程序和库指南》。
支持以下选项:
追踪 fork(2) 所创建的所有子项。此选项还将在每行的开头输出进程 ID。
跟踪从一个逗号分隔的共享目标文件列表发出的调用。仅跟踪从这些共享目标文件发出的调用。缺省值为仅跟踪从主可执行对象发出的调用。仅要求提供共享目标文件的基名。例如,libc 将匹配 /usr/lib/libc.so.1。此外,还支持 shell 样式通配符(如fnmatch(5) 中所述)。列表前面带有 "!" 表示不应跟踪从列表中目标文件发出的调用。如果要求跟踪从 command 发出的调用,则 command 必须是 tracefromlist 的成员。
apptrace 输出将定向到 outputfile。缺省情况下,apptrace 输出放置在所跟踪的进程的标准错误流上。
跟踪或排除函数调用。将跟踪逗号分隔列表 call 中指定的调用。如果列表以 ! 开头,将从跟踪输出中排除指定的函数调用。缺省值为 -t *。允许使用 shell 样式通配符。
跟踪对逗号分隔的共享目标文件列表的调用。缺省值为跟踪对所有共享目标文件的调用。如上所述,只需提供基名,且允许使用通配符。列表前面带有 "!" 表示不应跟踪对列表中目标文件的调用。
提供详细的格式化的参数输出,以及所指定的函数调用的返回值(如上面的 -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 无法跟踪对接受变量参数列表的函数的调用。在某些情况下,可通过一些巧妙的编码来解决此问题,尤其是在 printf 和 scanf 系列中。
apptrace 实用程序无法跟踪返回类型为 struct 或 union 的函数调用的返回值。
无法跟踪试图探测栈或提取调用者相关信息的函数。例如,[gs]etcontext()、[sig]longjmp()、[sig]setjmp() 和 vfork()。
对于 exit(2) 等不会返回的函数,不会跟踪其返回值。
为安全起见,只有具有相应特权的进程可以使用 apptrace 跟踪 setuid/setgid 程序。
在跟踪需要包含 <varargs.h> 才能使用的函数(例如 vwprintw(3XCURSES) 和 vwscanw(3XCURSES))时,将不会提供参数的格式化输出。
有关下列属性的说明,请参见 attributes(5):
|
ld.so.1(1)、truss(1)、vwprintw(3XCURSES)、vwscanw(3XCURSES)、attributes(5)、fnmatch(5)