Solaris下truss的使用
Solaris下truss的使用
原文转载:http://blog.csdn.net/sunlin5000/article/details/6560736
在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 标识(即线程标识)。
AIX 库的用户库函数有静态和动态两种装入函数调用。选项 -u 跟踪仅用于动态装入函数调用。
-u 选项提供动态装入函数调用的用户级函数调用跟踪。此选项产生函数调用的进入/退出跟踪。
标志
-a 显示在每一执行系统调用中传递的参数字符串。
-c 计数跟踪系统调用、故障和信号而不是逐行显示跟踪结果。跟踪命令终止或 truss 中断时生成摘要报告。若还使用 -f 标志,计数包含所有跟踪的系统调用、故障和子进程信号。
-d 每行输出包含时间戳记。时间从跟踪开始以每秒显示。跟踪输出的第一行显示测量单个时间戳记的基本时间。缺省不显示时间戳记。
-D 每行输出显示增量时间。增量时间表示从由该线程引起的最后报告事件起计时引起事件的 LWP 的逝去时间。缺省不显示增量时间。
-e 显示在每一执行系统调用中传递的环境字符串。
-f 跟在 fork 系统调用产生的所有子进程之后,并包含跟踪输出中的信号、故障和系统调用。 通常,仅跟踪第一级命令和进程。如果指定 -f 标志,进程标识与每行跟踪输出一起显示哪个进程执行系统调用或接收信号。
-i 阻止显示可中断的休眠系统调用。某些终端设备或管道的系统调用,如 open 和 kread,可无限期休眠且是可中断的。通常,如果这种休眠系统调用保持超过一秒休眠,truss 将报告。系统调用完成后一秒内报告系统调用。-i 标志使这种系统调用完成后仅报告一次。
-l 显示有关 LWP 进程的标识(线程标识)及 truss 输出。输出中缺省不显示 LWP 标识。
-m [!]Fault 跟踪进程中的机器故障。必须用逗号分隔要跟踪的机器故障。可按名称或代码指定故障(参见 sys/procfs.h 头文件)。如果列表以符号“!”开始,指定的故障不再被跟踪且不显示跟踪输出。缺省值是 -mall -m!fltpage。
-o Outfile 指定用于跟踪输出的文件。缺省时输出指向标准错误。
-p 将参数作为一列现存进程的进程标识而不是要执行的命令解释到 truss。 倘若进程用户标识或组标识与用户的用户标识或组标识匹配或者用户是特权用户,truss 控制并开始跟踪每个进程。
-r [!] FileDescriptor 显示每一个读取指定文件描述符的 I/O 缓冲区全内容。输出采用每行 32 字节的格式并以 ASCII 字符(跟在空格后)形式显示字节,或以控制字符的双字符 C 语言转义序列形式显示字节,如水平制表符 (/t) 或换行符 (/n)。如果不能解释成 ASCII 格式,字节以双字符十六进制形式显示。即使没有 -r 标志,仍显示跟踪读取 I/O 缓冲区的前 16 位字节。缺省值是 -r!all。
-s [!] Signal 允许列出要跟踪或除去的 Signals。跟踪列表中指定的信号(由逗号分隔)。信号被忽略但不是被进程阻塞时,跟踪输出仍报告每个指定信号的接收。直到进程释放时才可接收阻塞信 号。可按名称或代码指定信号(参见 sys/signal.h)。如果该列表以“!”符号开头,则列出的信号将从显示跟踪输出中排除。缺省值是 -s all。
-t [!] Syscall 包含或排除来自跟踪进程的系统调用。要跟踪的系统调用必须在列表中指定并以逗号分隔。如果列表以符号“!”开始,指定的系统调用将被从跟踪输出中排除。缺 省值是 -tall。
-u [!] [LibraryName […]::[!]FunctionName […] ]
跟踪来自用户库动态装入的用户级函数调用。 LibraryName 是逗号分隔的库名列表。FunctionName 是逗号分隔的函数名列表。两种情况下的名称都包含名称匹配元字符 *、? 和 [],这些字符与由 shell 解释的意义相同,但适用于库/函数名称空间而非文件。
任一列表中以 ! 开头的列指定不跟踪库或函数的排除名称列表。除去库将除去该库中所用函数。忽略库除去列表后的任何函数列表。可指定多个 -u 选项并将它们从左到右排列。缺省不跟踪库/函数调用。
-w [!] FileDescriptor 显示列出文件描述符每个写过程的 I/O 缓冲区内容(参见 -r)。缺省值是 -w!all。
-x [!] Syscall 以原始格式显示跟踪系统调用指定参数的数据,通常按十六进制而不是符号化方式。缺省值是 -x!all.
示例
1. 在终端上跟踪 find 命令,输入:
truss find . -print >find.out
2. 跟踪 lseek、close、statx 和开放系统调用,输入:
truss -t lseek,close,statx,open find . -print > find.out
3. 显示 find 命令的线程标识和常规输出,输入:
truss -l find . -print >find.out
4. 显示 find 命令的时间戳记和常规输出,输入:
truss -d find . -print >find.out
5. 显示 find 命令的增量时间和常规输出,输入:
truss -D find . -print >find.out
6. 运行 ls 命令时,在 libc.a 库中跟踪 malloc() 函数调用及除去 strlen() 函数调用,输入:
truss -u libc.a::malloc,!strlen ls
7. 运行 ls 命令时,跟踪 libc.a 库中名称以“m”开头的所有函数调用,输入:
truss -u libc.a::m*,!strlen ls
8. 运行可执行 foo 时,跟踪来自 libcurses.a 库的所有函数调用及除去来自 libc.a 的调用,输入:
truss -u libcurses.a,!libc.a::* foo
9. 运行可执行 foo 时,跟踪来自 libcurses.a 的 refresh() 函数调用和来自 libc.a 的 malloc() 函数调用,输入:
truss -u libc.a::malloc -u libcurses.a::refresh foo
下面是一个英文版本的介绍和范例。
Truss is used to trace the system/library calls (not user calls) and signals made/received by a new or existing process. It sends the output to stderr.
NOTE: Trussing a process throttles that process to your display speed. Use -wall and -rall sparingly.
Truss usage
truss -a -e -f -rall -wall -p
truss -a -e -f -rall -wall
-a Show arguments passed to the exec system calls
-e Show environment variables passed to the exec system calls
-f Show forked processes
(they will have a different pid: in column 1)
-rall Show all read data (default is 32 bytes)
-wall Show all written data (default is 32 bytes)
-p Hook to an existing process (must be owner or root)
Specify a program to run
Truss examples
# truss -rall -wall -f -p
# truss -rall -wall lsnrctl start
# truss -aef lsnrctl dbsnmp_start
A Running Example (using the date command)
# truss -d date
Base time stamp: 1066157908.5731 [ Tue Oct 14 14:58:28 EDT 2003 ]
0.0000 execve(”/usr/bin/date”, 0xFFBEF29C, 0xFFBEF2A4) argc = 1
0.0449 mmap(0×00000000, 8192, PROT_READ|PROT_WRITE|PROT_EXEC,MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFF3A0000
0.0453 resolvepath(”/usr/lib/ld.so.1″, “/usr/lib/ld.so.1″, 1023) = 16
0.0457 open(”/var/ld/ld.config”, O_RDONLY) Err#2 ENOENT
0.0460 open(”/usr/lib/libc.so.1″, O_RDONLY) = 3
0.0463 fstat(3, 0xFFBEE9C4) = 0
0.0464 mmap(0×00000000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xFF390000
0.0466 mmap(0×00000000, 794624, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xFF280000
0.0470 mmap(0xFF33A000, 24652, PROT_READ|PROT_WRITE|PROT_EXEC,MAP_PRIVATE|MAP_FIXED, 3, 696320) = 0xFF33A000
0.0474 munmap(0xFF32A000, 65536) = 0
0.0479 memcntl(0xFF280000, 113332, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0
0.0481 close(3) = 0
0.0483 open(”/usr/lib/libdl.so.1″, O_RDONLY) = 3
0.0485 fstat(3, 0xFFBEE9C4) = 0
0.0487 mmap(0xFF390000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED,3, 0) = 0xFF390000
0.0490 close(3) = 0
0.0493 open(”/usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1″, O_RDONLY) = 3
0.0496 fstat(3, 0xFFBEE854) = 0
0.0497 mmap(0×00000000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xFF380000
0.0500 mmap(0×00000000, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xFF370000
0.0502 close(3) = 0
0.0514 munmap(0xFF380000, 8192) = 0
0.0521 brk(0×00022420) = 0
0.0523 brk(0×00024420) = 0
0.0526 time() = 1066157908
0.0531 open(”/usr/share/lib/zoneinfo/US/Eastern”, O_RDONLY) = 3
0.0533 read(3, ” T Z i f/0/0/0/0/0/0/0/0″.., 8192) = 1250
0.0536 close(3) = 0
0.0542 ioctl(1, TCGETA, 0xFFBEEFDC) = 0
Tue Oct 14 14:58:28 EDT 2003
0.0545 write(1, ” T u e O c t 1 4 1″.., 29) = 29
0.0547 llseek(0, 0, SEEK_CUR) = 1829
0.0549 _exit(0)
NOTE: The “truss” command works on SUN and Sequent. Use “strace” on Linux. If your operating system doesn’t support the truss and strace commands, call your system administrator to find the equivalent command on your system.
Monitor your Unix system:
Unix message files record all system problems like disk errors, swap errors, NFS problems, etc. Monitor the following files on your system to detect system problems:
# tail -f /var/adm/SYSLOG
# tail -f /var/adm/messages
# tail -f /var/log/syslog
(TS-st200-11173-Wed:)/home/lin/forms>truss cat /etc/hosts
execve("/usr/bin/cat", 0x08047918, 0x08047924) argc = 2
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, -1, 0) = 0xFEFF0000
resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = 12
resolvepath("/usr/bin/cat", "/usr/bin/cat", 1023) = 12
sysconfig(_CONFIG_PAGESIZE) = 4096
stat64("/usr/bin/cat", 0x080476B0) = 0
open("/var/ld/ld.config", O_RDONLY) Err#2 ENOENT
stat64("/usr/local/lib/libc.so.1", 0x08046F50) Err#2 ENOENT
stat64("/home/oracle/lib/libc.so.1", 0x08046F50) Err#2 ENOENT
stat64("/lib/libc.so.1", 0x08046F50) = 0
resolvepath("/lib/libc.so.1", "/lib/libc.so.1", 1023) = 14
open("/lib/libc.so.1", O_RDONLY) = 3
mmap(0x00010000, 32768, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ALIGN, 3, 0) = 0xFEFB0000
mmap(0x00010000, 1212416, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANON|MAP_ALIGN, -1, 0) = 0xFEE80000
mmap(0xFEE80000, 1102437, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_TEXT, 3, 0) = 0xFEE80000
mmap(0xFEF9E000, 30183, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_INITDATA, 3, 1105920) = 0xFEF9E000
mmap(0xFEFA6000, 4240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANON, -1, 0) = 0xFEFA6000
munmap(0xFEF8E000, 65536) = 0
memcntl(0xFEE80000, 124080, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0
close(3) = 0
mmap(0x00010000, 24576, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON|MAP_ALIGN, -1, 0) = 0xFEF90000
munmap(0xFEFB0000, 32768) = 0
getcontext(0x08047520)
getrlimit(RLIMIT_STACK, 0x08047518) = 0
getpid() = 1181 [1180]
lwp_private(0, 1, 0xFEF92A00) = 0x000001C3
setustack(0xFEF92A60)
sysi86(SI86FPSTART, 0xFEFA6740, 0x0000133F, 0x00001F80) = 0x00000001
sysconfig(_CONFIG_PAGESIZE) = 4096
brk(0x0806A7A8) = 0
brk(0x0806C7A8) = 0
stat64("/usr/lib/locale/en_US/en_US.so.3", 0x080467B0) = 0
resolvepath("/usr/lib/locale/en_US/en_US.so.3", "/usr/lib/locale/en_US.ISO8859-1/en_US.ISO8859-1.so.3", 1023) = 52
open("/usr/lib/locale/en_US/en_US.so.3", O_RDONLY) = 3
mmap(0x00010000, 32768, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ALIGN, 3, 0) = 0xFEFB0000
mmap(0x00010000, 86016, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANON|MAP_ALIGN, -1, 0) = 0xFEE60000
mmap(0xFEE60000, 15002, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_TEXT, 3, 0) = 0xFEE60000
mmap(0xFEE73000, 5026, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_INITDATA, 3, 12288) = 0xFEE73000
munmap(0xFEE64000, 61440) = 0
memcntl(0xFEE60000, 5500, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0
close(3) = 0
stat64("/usr/local/lib/libc.so.1", 0x08046710) Err#2 ENOENT
stat64("/home/oracle/lib/libc.so.1", 0x08046710) Err#2 ENOENT
munmap(0xFEFB0000, 32768) = 0
fstat64(1, 0x080477C0) = 0
open64("/etc/hosts", O_RDONLY) = 3
fstat64(3, 0x08047850) = 0
llseek(3, 0, SEEK_CUR) = 0
read(3, " #/n # I n t e r n e t".., 8192) = 2810
#
# Internet host table
#
127.0.0.1 localhost
172.16.0.111 st200 isp loghost www.timese11.com.cn
192.168.11.1 ps11
write(1, " #/n # I n t e r n e t".., 2810) = 2810
read(3, 0x080621B8, 8192) = 0
llseek(3, 0, SEEK_CUR) = 2810
close(3) = 0
close(1) = 0
_exit(0)
(TS-st200-11173-Wed:)/home/lin/forms>
首先,使用execve()方法调用cat命令,读取库文件,最后输出
Solaris下truss的使用的更多相关文章
- solaris下的常用命令
屏幕显示: cat输出到屏幕: more 整屏显示,b显示上一屏,f显示下一屏: head显示文件的前n行: tail显示文件的后n行: man查看命令帮助: 目录操作: 创建目录: mkdir, ...
- Solaris下怎样改动文件创建时间及查询
Solaris下怎样改动文件创建时间及查询 实验演示: 1.核对时间 [root@S1011:/]# date Tue Jul 15 21:37:01 CDT 2014 --若时间不对请先按例如以下格 ...
- solaris 下查看某程序所开端口
普通linux机器下可以用netstat -anp | grep pid即可. solaris下则不同,可以借助pfiles工具,pfiles $pid | grep sock pfiles | gr ...
- solaris下安装oracle 11g与11g rac
1.To Find Swap, RAM, and OS Version 对于 Solaris 操作系统,查看 Swap, RAM, and OS Version 的方法: swap -l /usr/s ...
- Solaris 下解决上网问题以及远程登录问题
解决乱码问题 参考文章 http://www.jb51.net/os/Solaris/1656.html solaris 显示乱码的解决方法 现象: 利用命令 : LANG=zh; export LA ...
- [转载] linux、Solaris下xdmcp远程桌面服务
原文链接 http://youlvconglin.blog.163.com/blog/static/52320420106243857254/ 使用图形界面远程登录linux和Solaris,首先要在 ...
- Solaris 10下使用Python3
通常在Solaris 10上仅仅能使用Python2.x. 假设使用Python3的话,一种就是http://www.sunfreeware.com获取可用的二进制版本号.只是眼下这个站点已经不提供免 ...
- Solaris/Linux 命令手册
无意翻到之前收藏的一个文档,共享一下. Solaris/Linux 命令手册 1. 系统 # passwd:修改口令 # exit:退出系统 2. 文件 # cp:复制文件或目录,参数:-a递归目录, ...
- 【转载】Linux下makefile详解--跟我一起写 Makefile
概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...
随机推荐
- java 判断Map集合中包含指定的键名,则返回true,否则返回false。
public static void main(String[] args) { Map map = new HashMap(); //定义Map对象 map.put("apple" ...
- 源码编译apache报错的解决方法
源码编译apache报错的解决方法 问题介绍 在源码编译安装httpd时,./configure执行无错误,到make时就报错,在网络上搜索了很多文章,很多方法如换apr-util的低版本并不能很 ...
- Mac 安装 Novicat
https://blog.csdn.net/jor_ivy/article/details/81323199 详细见这篇文章
- Checkbox 多选框
Checkbox 多选框 一组备选项中进行多选 ¶基础用法 单独使用可以表示两种状态之间的切换,写在标签中的内容为 checkbox 按钮后的介绍. 在el-checkbox元素中定义v-model绑 ...
- SAE中Python无法创建多线程的解决方案
最近在SAE上开发了一个给kindle退送书的小公众号(kindle免费书库),由于微信对http响应时间 有限制,而推送本身是发邮件,当附件一大就很容易超时而使得用户收不到应答.一开始我是想通过多线 ...
- 2 Configuring SAP ERP Sales and Distribution -introduction to SAP
First Steps in SAPWe’ll now discuss some of the basic menus, screens, and transactions that you need ...
- 第 10 章 python进程与多进程
一.背景知识 顾明思义,进程即正在执行的一个过程,进程是对正在云的程序的一个抽象. 进程的概念起源与操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一,操作系统的其他所 ...
- leaflet的入门开发(一)
2016年9月27日—1.0leaflet,最快的,最稳定和严谨的leaflet,终于出来了! leaflet是领先的开源JavaScript库为移动设备设计的互动地图.重33 KB的JS,所有映射大 ...
- Pytorch笔记 (1) 初始神经网络
一.人工神经元 上方人工神经元中: 输入 * 权重 ——> 相当于 人神经元中 树突的功能 各输入 相加 ,再做非线性变化f ——> 相当于胞体的功能 将非线性变化的结果输出 ——& ...
- 在redis里面使用lua
Redis从2.6版本开始引入对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务端原子的执行多个Redis命令. lua脚本的好处: 减少网络开销.可以将 ...