使用跟踪来解决应用程序中的问题
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 责编:豆豆技术应用
- Linux/Unix 新闻
- Linux/Unix 入门
- Linux/Unix 命令
- Linux/Unix 安装
- Linux 嵌入式系统
- Linux/Unix 编程
- Linux/Unix 管理
- Linux/Unix 桌面
- Linux/Unix 内核
- Linux/Unix 软件
- SCO Unix
- NetBSD
- OpenBSD
- Redhat/Fedora Linux
- 手机
- Linux/Unix find 搜索命令
- Linux/Unix vi 命令
- Linux/Unix kde 桌面环境
- Linux/Unix GNOME 桌面环境
- Linux/Unix Make 命令
- Linux/Unix crontab 命令
- Linux/Unix ext3 文件系统
- Linux/Unix 文件系统详解
- Linux/Unix ADSL 拨号设置
- Linux/Unix GRUB 配置及应用
- Linux/Unix nfs配置
- Linux/Unix 硬件信息查看及管理
- Linux/Unix 优化
- Linux/Unix 交换分区Swap管理及应用
- Linux/Unix 用户管理
- Linux/Unix Ramdisk
- Linux/Unix 密码恢复管理
- Linux/Unix 文件删除恢复
- Linux/Unix fdisk分区
- Linux/Unix lvs负载均衡管理
- Linux/Unix root用户
- Linux/Unix 集群
- Linux/Unix 日志
- 更多Linux/Unix专题……