truss 命令
用途
跟踪进程的系统调用、动态装入的用户级函数调用、接收的信号和造成的机器故障。
语法
桁架 [ -f] [ -c] [ -a] [ -l ] [ -d ] [ -D ] [ -e] [ -i] [ { -t | -x} [!] 系统调用 [...] ] [ -s [!] 信号 [...] ] [ { -m }[!] 故障 [...]] [ { -u-r | -w} [!] FileDescriptor [...] ] [ { } [!]图书馆名称 [...]:: [!]功能名称 [ ... ] ] [ -o 输出文件] {指挥| -p pid [. . .]}[-X]
描述
truss 命令执行指定命令或附加在列出进程标识上,并产生对系统调用、接收的信号和进程造成的机器故障的跟踪。 每行跟踪输出报告 Fault 或 Signal 名称或 Syscall 名称和参数及返回值。 系统库定义的子例程对于内核的严格系统调用并不是必要的。 桁架 命令不报告这些子例程,而是由底层系统调用它们。 如果可能,将使用相关系统头文件中的定义以符号方式显示系统调用参数。 对于路径名指针参数,truss 显示指向的字符串。 未定义的系统调用缺省显示系统名称、所有八个可能的变量及十六进制格式的返回值。
当 -o 标志与 truss 一起使用,或标准错误改指向非终端文件时,truss 忽略挂断、中断和信号进程。 它促进跟踪交互式程序从终端获得 interrupt 和 quit 信号。
若跟踪输出保持指向终端或跟踪现存过程(使用 -p 标志), truss 对 hangup、interrupt 和 quit 信号做出反应,释放所有跟踪进程并退出。 它使用户可终止过多的跟踪输出并释放前现存进程。 释放进程继续到功能恢复正常。
对与含有一列变量的选项,名称 all 可用作指定列表中所有可能成员的简写。 如果列表以 !开头, 选项的含义被否定 (例如,排除而不是跟踪)。 同一选项可能指定为多种表现形式。 同一列表的相同名称,后面的选项(右边选项)覆盖前面的选项(左边选项)。
除了页面故障以外的所有机器故障均导致公布信号到发生故障进程。 除了进程阻塞信号,每一机器故障报告后立即给出接收的信号报告。
为避免与其他控制进程冲突,truss 不跟踪由其检测到并由带有 /proc 接口的另一进程控制的进程。
多进程跟踪输出不是按严格的时间顺序产生。 示例:管道读取可以在相应的写之前报告。 然而每一进程输出是严格按时间排序。 跟踪输出含有制表符,且每八个位置设置标准制表符停止位。
系统跟踪子进程时可运行于每个用户进程槽之外。 这是因为跟踪多个进程时,truss 作为所跟踪进程的控制进程运行,将用于所给进程的进程槽数目加倍。 运行多进程跟踪之前应考虑通常系统强制的每个用户 25 进程的限制。
操作系统为进程跟踪强加某种安全限制。 必须有跟踪命令的访问特权。 set-uid 和 set-gid 进程仅可由特权用户跟踪。 除由特权用户运行外,truss 命令无法控制执行 set-id 或不可读对象代码的进程。 这些未跟踪的进程从执行点保持正常并与 truss 无关。
truss 输出提到的轻量级进程(LWP)是真正的内核线程。 选项 -l 在每行跟踪输出显示 LWP 标识(即线程标识)。
AIX库中的用户库函数既有静态加载函数调用,也有动态加载函数调用。 选项 -u 跟踪仅用于动态装入函数调用。
-u 选项提供动态装入函数调用的用户级函数调用跟踪。 此选项产生函数调用的进入/退出跟踪。
标志
| 项 | 描述 |
|---|---|
| -a | 显示在每次执行系统调用时传递的参数字符串。 |
| -c | 计数跟踪系统调用、故障和信号而不是逐行显示跟踪结果。 跟踪命令终止或 truss 中断时生成摘要报告。 若还使用 -f 标志,计数包含所有跟踪的系统调用、故障和子进程信号。 |
| -d | 每行输出包含时间戳记。 时间从跟踪开始以每秒显示。 跟踪输出的第一行显示测量单个时间戳记的基本时间。 缺省不显示时间戳记。 |
| -D | 每行输出显示增量时间。 增量时间表示从由该线程引起的最后报告事件起计时引起事件的 LWP 的逝去时间。 缺省不显示增量时间。 |
| -e | 显示在每次执行系统调用时传递的环境字符串。 |
| -f | 跟在 fork 系统调用产生的所有子进程之后,并包含跟踪输出中的信号、故障和系统调用。 通常,仅跟踪第一级命令或进程。 如果指定 -f 标志,进程标识与每行跟踪输出一起显示哪个进程执行系统调用或接收信号。 |
| -i | 阻止显示可中断的休眠系统调用。 某些终端设备或管道的系统调用,如 open 和 kread,可无限期休眠且是可中断的。 通常,如果这种休眠系统调用保持超过一秒休眠,truss 将报告。 系统调用完成后一秒内报告系统调用。 -i 标志使这种系统调用完成后仅报告一次。 |
| -l | 显示有关 LWP 进程的标识(线程标识)及 truss 输出。 输出中缺省不显示 LWP 标识。 |
| -m [!]故障 | 跟踪进程中的机器故障。 必须用逗号分隔要跟踪的机器故障。 可按名称或代码指定故障(请参阅 sys/procfs.h 头文件)。 如果列表以 "!" 开头 符号,指定的故障将被排除在跟踪之外,并且不会随跟踪输出一起显示。 缺省值为 -mall -m!fltpage。 |
| -o 输出文件 | 指定用于跟踪输出的文件。 缺省时输出指向标准错误。 |
| -p | 将参数作为一列现存进程的进程标识而不是要执行的命令解释到 truss。 倘若进程用户标识或组标识与用户的用户标识或组标识匹配或者用户是特权用户,truss 控制并开始跟踪每个进程。 |
| - r [! ] FileDescriptor | 显示每一个读取指定文件描述符的 I/O 缓冲区全内容。 输出采用每行 32 字节的格式并以 ASCII 字符(跟在空格后)形式显示字节,或以控制字符的双字符 C 语言转义序列形式显示字节,如水平制表符(\t)或换行符(\n)。 如果不能解释成 ASCII 格式,字节以双字符十六进制形式显示。 即使没有 -r 标志,对于每次被跟踪的读操作,仍会显示 I/O 缓冲区的前 12 个字节。 缺省值为 -r! all。 |
| -s [!] 信号 | 允许列出要跟踪或除去的 Signals。 跟踪列表中指定的信号(由逗号分隔)。 信号被忽略但不是被进程阻塞时,跟踪输出仍报告每个指定信号的接收。 直到进程释放时才可接收阻塞信号。 可按名称或代码指定信号(请参阅 sys/signal.h)。 如果该列表以“!”符号开头, 则列出的信号将从显示跟踪输出中排除。 缺省值为 -s all。 |
| - t [! ] 系统调用 | 包含或排除来自跟踪进程的系统调用。 要跟踪的系统调用必须在列表中指定并以逗号分隔。 如果列表以 "!" 开头 符号,指定的系统调用将从跟踪输出中排除。 缺省值为 -tall。 |
| - u [!] LibraryName[...]::[!]FunctionName[...] ] | 跟踪来自用户库动态装入的用户级函数调用。 LibraryName 是逗号分隔的库名列表。 FunctionName 是逗号分隔的函数名列表。 两种情况下的名称都包含名称匹配元字符 *、? 和 [],这些字符与由 shell 解释的意义相同,但适用于库/函数名称空间而非文件。 领先的 ! 开头的列指定不跟踪库或函数的排除名称列表。 除去库将除去该库中所用函数。 忽略库除去列表后的任何函数列表。 可指定多个 -u 选项并将它们从左到右排列。 缺省不跟踪库/函数调用。 |
| - w [! ] FileDescriptor | 显示列示的任何文件描述符上的每个写操作的 I/O 缓冲区的内容 (请参阅 -r)。 缺省值为 -w! all。 |
| - x [! ] 系统调用 | 以原始格式显示跟踪系统调用指定参数的数据,通常按十六进制而不是符号化方式。 缺省值为 -x! all。 |
| -X | 以人类可读的格式显示跟踪系统调用指定参数的数据。 支持的系统调用为:bind,、connect、socketpair、lseek, creat, access、accept、socket 和 statx。 |
安全性
示例
- 要在终端上跟踪 find 命令,请输入:
truss find . -print >find.out - 要跟踪 lseek、close、statx 和开放系统调用,请输入:
truss -t lseek,close,statx,open find . -print > find.out - 要显示 find 命令的线程标识和常规输出,请输入:
truss -l find . -print >find.out - 要显示 find 命令的时间戳记和常规输出,请输入:
truss -d find . -print >find.out - 要显示 find 命令的增量时间和常规输出,请输入:
truss -D find . -print >find.out - 在运行 ls 命令时,要跟踪 libc.a 库中的 malloc() 函数调用及排除 strlen() 函数调用,请输入:
truss -u libc.a::malloc,!strlen ls - 在运行 ls 命令时,要跟踪 libc.a 库中名称以“m”开头的所有函数调用,并排除 libc.a 库中的 strlen() 函数调用,请输入:
truss -u libc.a::m*,!strlen ls - 在运行 ls 命令时,要跟踪 libc.a 库中名称以“m”开头的所有函数调用,请输入:
truss -u libc.a::m* ls - 要跟踪库 libcurses.a 中的所有函数调用,并在运行可执行文件
foo时排除 libc.a 中的调用,请输入:truss -u libcurses.a,!libc.a::* foo - 要在运行可执行文件
foo时跟踪来自 libcurses.a 的 refresh () 函数调用和来自 libc.a 的 malloc () 函数调用,请输入:truss -u libc.a::malloc -u libcurses.a::refresh foo - 要以人类可读的格式跟踪系统调用自变量,请输入:
truss -X -t lseek,bind,statx,creat find . -print > find.out
文件
/proc 文件系统