使用跟踪来解决应用程序中的问题

http://tech.ddvip.com   2008年09月06日    社区交流

内容摘要:可以使用 truss 来查看应用程序的行为。当应用程序没有按预期的方式工作时,通常作为优先的求助方法,您可以检查应用程序和系统日志。但是当日志无法提供帮助时,UNIX® 提供了一套功能强大的工具,可以用来在应用程序运行期间对其进行跟踪。有了这些跟踪信息和对 UNIX 的基本认识,您就可以轻松地解决应用程序中的问题了。

  系统管理员常常对应用程序中发生的事情感到困惑。您肯定碰到过这种情况:看起来启动了应用程序,但随后它却停止了,或者应用程序挂起了而没有任何输出。日志和文档都无法提供任何帮助。下一步您应该进行应用程序跟踪。

  应用程序跟踪显示了应用程序对外部库和内核的调用情况。应用程序通过这些调用来访问网络、文件系统及显示。通过观察这些调用及其结果,可以了解应用程序需要什么,并由此找到解决方案。

  每个 UNIX® 系统都提供了进行跟踪的命令。本文向您介绍 Solaris 和 AIX® 支持的 truss 命令。在 Linux® 中,可以使用 strace 命令来执行跟踪。尽管命令行参数可能有些细微的差别,其他 UNIX 版本中的应用程序跟踪可能使用名称 ptrace、ktrace、trace 和 tusc。

  一个经典的文件权限问题

  有一类问题常常困扰着系统管理员,即文件权限。应用程序在完成工作的过程中可能需要打开某些文件。如果打开操作失败,该应用程序应该通知系统管理员。然而,开发人员常常忘记检查函数的结果,或者更令人困惑的是,执行了检查却没有恰当地处理该错误。例如,下面是一个应用程序在打开操作失败时的输出:

$ ./openapp
This should never happen!

  在运行了虚构的应用程序 openapp 后,得到的是毫无帮助的(和错误的)错误消息,This should never happen!。现在是介绍 truss 的好时候了。清单 1 显示了同一应用程序在 truss 命令下的运行情况,而该命令显示了这个应用程序对外部库的所有函数调用。

  清单 1. Openapp 在 truss 命令下的运行

$ truss ./openapp
execve("openapp", 0xFFBFFDEC, 0xFFBFFDF4) argc = 1
getcwd("/export/home/sean", 1015)        = 0
stat("/export/home/sean/openapp", 0xFFBFFBC8)  = 0
open("/var/ld/ld.config", O_RDONLY)       Err#2 ENOENT
stat("/opt/csw/lib/libc.so.1", 0xFFBFF6F8)   Err#2 ENOENT
stat("/lib/libc.so.1", 0xFFBFF6F8)       = 0
resolvepath("/lib/libc.so.1", "/lib/libc.so.1", 1023) = 14
open("/lib/libc.so.1", O_RDONLY)        = 3
memcntl(0xFF280000, 139692, MC_ADVISE, MADV_WILLNEED, 0, 0) = 0
close(3)                    = 0
getcontext(0xFFBFF8C0)
getrlimit(RLIMIT_STACK, 0xFFBFF8A0)       = 0
getpid()                    = 7895 [7894]
setustack(0xFF3A2088)
open("/etc/configfile", O_RDONLY)        Err#13 EACCES [file_dac_read]
ioctl(1, TCGETA, 0xFFBFEF14)          = 0
fstat64(1, 0xFFBFEE30)             = 0
stat("/platform/SUNW,Sun-Blade-100/lib/libc_psr.so.1", 0xFFBFEAB0) = 0
open("/platform/SUNW,Sun-Blade-100/lib/libc_psr.so.1", O_RDONLY) = 3
close(3)                    = 0
This should never happen!
write(1, " T h i s  s h o u l d ".., 26)   = 26
_exit(3)

来源:developerWorks    作者:Sean Walberg    责编:豆豆技术应用

正在加载评论...