利用truss在Solaris下定位问题

发表于:2009-05-22来源:作者:点击数: 标签:Solarissolaristruss
在Solaris下面,如果需要跟踪系统的调用,以便查找和定位问题,truss是一个非常有用的命令,下面就对这个命令做详细介绍。 truss 命令 用途 跟踪进程的系统调用、动态装入的用户级函数调用、接收的信号和造成的机器故障。 语法 truss [ -f] [ -c] [ -a] [ -l
   在Solaris下面,如果需要跟踪系统的调用,以便查找和定位问题,truss是一个非常有用的命令,下面就对这个命令做详细介绍。

truss 命令
用途

        跟踪进程的系统调用、动态装入的用户级函数调用、接收的信号和造成的机器故障。

语法

truss [ -f] [ -c] [ -a] [ -l ] [ -d ] [ -D ] [ -e] [ -i] [ { -t | -x} [!] Syscall […] ] [ -s [!] Signal […] ] [ { -m }[!] Fault […]] [ { -r | -w} [!] FileDescriptor […] ] [ { -u } [!]LibraryName […]:: [!]FunctionName [ … ] ] [ -o Outfile] {Command| -p pid [. . . .]}

描述
        truss 命令执行指定命令或附加在列出进程标识上,并产生对系统调用、接收的信号和进程造成的机器故障的跟踪。每行跟踪输出报告 Fault 或 Signal 名称或 Syscall 名称和参数及返回值。系统库定义的子例程对于内核的严格系统调用并不是必要的。truss 命令不报告这些子例程,而是报告子例程的基本系统调用。 可能的话,系统调用参数使用有关系统头文件定义符号显示。对于路径名指针参数,truss 显示指向的字符串。未定义的系统调用缺省显示系统名称、所有八个可能的变量及十六进制格式的返回值。

  当 -o 标志与 truss 一起使用,或标准错误改指向非终端文件时,truss 忽略挂断、中断和信号进程。它促进跟踪交互式程序从终端获得 interrupt 和 quit 信号。

        若跟踪输出保持指向终端或跟踪现存过程(使用 -p 标志),truss 对 hangup、interrupt 和 quit 信号做出反应,释放所有跟踪进程并退出。它使用户可终止过多的跟踪输出并释放前现存进程。释放进程继续到功能恢复正常。

        对与含有一列变量的选项,名称 all 可用作指定列表中所有可能成员的简写。以 ! 开头的列表,选项含义是相反的(示例:排除而非跟踪)。同一选项可能指定为多种表现形式。同一列表的相同名称,后面的选项(右边选项)覆盖前面的选项(左边选项)。

        除了页面故障以外的所有机器故障均导致公布信号到发生故障进程。除了进程阻塞信号,每一机器故障报告后立即给出接收的信号报告。

        为避免与其它控制进程冲突,truss 不跟踪由其检测到并由带有 /proc 接口的另一进程控制的进程。

        多进程跟踪输出不是按严格的时间顺序产生。示例:管道读取可以在相应的写之前报告。然而每一进程输出是严格按时间排序。跟踪输出含有制表符,且每八个位置设置标准制表符停止位。

        系统跟踪子进程时可运行于每个用户进程槽之外。这是因为跟踪多个进程时,truss 作为所跟踪进程的控制进程运行,将用于所给进程的进程槽数目加倍。运行多进程跟踪之前应考虑通常系统强制的每个用户 25 进程的限制。

        处理多个进程时,truss 使用共享内存和信号。例如:在多进程标识下使用 -f 标志和 -p 标志。需要的话,跟踪可运行于非配置系统中。这些情况下,truss 生成警告消息并继续跟踪。然而跟踪输出可能断章取义,-c 标志输出仅报告顶级命令或第一个进程标识,不计数子进程。

        操作系统为进程跟踪强加某种安全性限制。必须有跟踪命令的存取特权。 set-uid 和 set-gid 进程仅可由特权用户跟踪。除由特权用户运行外,truss 命令无法控制执行 set-id 或不可读对象代码的进程。这些未跟踪的进程从执行点保持正常并与 truss 无关。

        truss 输出提到的轻量级进程(LWP)是真正的内核线程。选项 -l 在每行跟踪输出显示 LWP 标识(即线程标识)。

      

原文转自:http://www.ltesting.net