电脑技术学习

跟踪 UNIX 应用程序的解决方案

dn001

  除了这些差异之外,跟踪和调试之间的主要差异是,跟踪不要求访问源代码,也不要求以任何特殊方式编译应用程序。这意味着可以跟踪操作系统附带的或第三方厂商提供的应用程序。

  通过跟踪应用程序,可以查明以下方面的情况:

  内存使用量和映射内存的调用

  在执行期间打开和关闭的文件

  对不同文件的读和写操作

  为给定的应用程序装载的库

  下面先研究一下 truss 的输出,truss 是一种可以在 Solaris 和 AIX® 上使用的工具。

  使用 truss 和 strace

  在 Solaris 和 AIX 上可以使用 truss 工具,它能够跟踪应用程序中的系统调用和信号。可以在 Linux® 上使用的 strace 工具提供相似的功能。在不同的系统上,还有提供相似信息的其他工具,包括 ktrace (FreeBSD) 和 trace。

  truss/strace 概述

  truss 和 strace 工具提供相似的信息,但是命令行选项稍有差异。使用这两种工具的标准方法都是把工具名放在要执行的命令前面。

  例如,清单 3 给出 truss 对于本教程前面提到的 ageindays 程序的输出。

  清单 3. truss 的输出

$ truss ./ageindays 24/1/1980 26/3/2009 
execve("ageindays", 0x08047BBC, 0x08047BCC) argc = 3 
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, -1, 0) 
  = 0xFEFB0000 
resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = 12 
getcwd("/root", 1013)              = 0 
resolvepath("/root/ageindays", "/root/ageindays", 1023) = 15 
xstat(2, "/root/ageindays", 0x08047880)     = 0 
open("/var/ld/ld.config", O_RDONLY)       = 3 
fxstat(2, 3, 0x08047760)            = 0 
mmap(0x00000000, 144, PROT_READ, MAP_SHARED, 3, 0) = 0xFEFA0000 
close(3)                    = 0 
sysconfig(_CONFIG_PAGESIZE)           = 4096 
xstat(2, "/usr/lib/libc.so.1", 0x08046FA0)   = 0 
resolvepath("/usr/lib/libc.so.1", "/lib/libc.so.1", 1023) = 14 
open("/usr/lib/libc.so.1", O_RDONLY)      = 3 
mmap(0x00010000, 32768, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ALIGN, 3, 0) 
  = 0xFEF90000 
mmap(0x00010000, 1413120, PROT_NONE, MAP_PRIVATE|MAP_NORESERVE|MAP_ANON|MAP_ALIGN, -1, 0) 
  = 0xFEE30000 
mmap(0xFEE30000, 1302809, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_TEXT, 3, 0) 
  = 0xFEE30000 
mmap(0xFEF7F000, 30862, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED| 
  MAP_INITDATA, 3, 1306624) = 0xFEF7F000 
mmap(0xFEF87000, 4776, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANON, 
  -1, 0) = 0xFEF87000 
munmap(0xFEF6F000, 65536)            = 0 
memcntl(0xFEE30000, 187632, 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) 
  = 0xFEE20000 
munmap(0xFEF90000, 32768)            = 0 
getcontext(0x080475D0) 
getrlimit(RLIMIT_STACK, 0x080475C8)       = 0 
getpid()                    = 15691 [15690] 
lwp_private(0, 1, 0xFEE22A00)          = 0x000001C3 
setustack(0xFEE22A60) 
sysi86(SI86FPSTART, 0xFEF879BC, 0x0000133F, 0x00001F80) = 0x00000001 
ioctl(1, TCGETA, 0x08046C20)          = 0 
fstat64(1, 0x08046B80)             = 0 
You have been alive 10654 days 
write(1, " Y o u  h a v e  b e e".., 31)   = 31 
You were born on 24/1/1980 which is a Thursday 
write(1, " Y o u  w e r e  b o r".., 47)   = 47 
_exit(134511508) 

标签: