使用truss命令定位应用程序运行问题的案例

1、问题描述
      运行应用程序时出现core dump,程序无法启动;应用程序在运行过程中挂起,没有任何输出;应用程序运行出错,但错误信息不足以明确判断错误原因。且应用程序日志无法提供任何有用的帮助。
2、解决方案
      可以使用AIX 5L 的truss命令来查看应用程序的执行行为。当应用程序没有按预期的方式工作时,通常优先的求助方法是检查应用程序和系统日志。但是,当日志无法提供有用帮助时,可以用truss命令对应用程序的运行进行跟踪。有了这些跟踪信息和对AIX的基本认识,就可以轻松定位应用程序运行中的问题了。
      truss命令显示了应用程序对外部库和内核的调用情况。应用程序一般使用这些调用来访问网络、文件系统以及显示信息。通过观察这些调用及其结果,可以了解应用程序需要什么,并由此找到解决方案。
      以下通过一个ftp应用程序的执行权限问题来阐述truss命令的作用:
      在进行ftp操作时,只有root用户能正常执行ftp命令,系统显示ftp提示信息。普通用户执行ftp命令时直接退出,且无任何错误信息显示。使用truss命令对ftp应用程序进行跟踪:
# truss ftp xx.xx.xx.xx
输出结果如下:
execve("/usr/bin/ftp", 0x2FF22B74, 0x2FF22B80)   argc: 2
__loadx(0x03020000, 0x2FF22A30, 0x00000090, 0xDEADBEEF, 0xDEADBEEF) = 0x00000000
__loadx(0x0A040000, 0xD036915C, 0x5F5F5F62, 0x5F5F7274, 0x00000000) = 0x00000000
。。。
getgidx(1)                                      = 202
__loadx(0x01000080, 0x2FF1E450, 0x00003E80, 0x2FF223E0, 0x00000000) = 0xD007F130
access("/usr/lib/nls/msg/en_US/ftp.cat", 0)     = 0
_getpid()                                       = 569576
socket(1, 2, 0)                                 = 3
kfcntl(3, F_SETFD, 0x00000001)                  = 0
connext(3, 0xF0383D5C, 16)                      = 0
auditproc(0, 4, "", 0)                          Err#1  EPERM
_getpid()                                       = 569576
access("/usr/lib/nls/msg/en_US/libc.cat", 0)    = 0
_getpid()                                       = 569576
open("/usr/lib/nls/msg/en_US/libc.cat", O_RDONLY) = 4
kioctl(4, 22528, 0x00000000, 0x00000000)        Err#25 ENOTTY
kfcntl(4, F_SETFD, 0x00000001)                  = 0
kioctl(4, 22528, 0x00000000, 0x00000000)        Err#25 ENOTTY
kread(4, "\0\001 鵟007\007 I S O 8".., 4096)    = 4096
lseek(4, 0, 1)                                  = 4096
lseek(4, 0, 1)                                  = 4096
lseek(4, 0, 1)                                  = 4096
_getpid()                                       = 569576
lseek(4, 0, 1)                                  = 4096
close(4)                                        = 0
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC)     = 4
kioctl(4, 22528, 0x00000000, 0x00000000)        Err#19 ENODEV
kioctl(4, 22528, 0x00000000, 0x00000000)        Err#19 ENODEV
kwrite(4, " f t p :   a u d i t p r".., 41)     = 41
close(4)                                        = 0
send(3, 0x2FF21D54, 73, 0)                      = 73
__loadx(0x04000000, 0x2FF20520, 0x00002000, 0xF03DE8B0, 0x00000000) = 0x00000000
kfcntl(1, F_GETFL, 0x00000001)                  = 2
kfcntl(2, F_GETFL, 0x00000000)                  = 2
_exit(1)
      输出中的每一行表示了应用程序进行的一个函数调用,并且在合适的情况下,还显示了其返回值。要查找潜在导致该问题的调用,最简单的方法通常是从最末尾处开始。向上滚动错误消息可以发现,第一个错误出现在auditproc(0, 4, "", 0)行,该行返回了错误 Err#1  EPERM。查看auditproc()函数的返回码,EPERM的错误含义是函数调用者没有root用户的权限。很明显,该函数是要查询或设置进程的审计状态,但执行时需要有root用户的权限。返回值EPERM意味着该问题与权限有关。因为在正常情况下普通用户是可以使用ftp应用的,所以这可能与ftp应用程序的set-uid属性有关。检查ftp应用程序的权限时发现,当前ftp应用程序的权限是-r-xr-xr-x,而正常的ftp应用程序的权限是-r-sr-xr-x。使用chmod u+s ftp命令更改权限后,普通用户就可以正常运行ftp应用程序了。
      总之,能够查看跟踪应用程序的执行行为是排除进程故障的有效手段。当常规的问题解决方法失效时,可以进行应用程序跟踪。通过跟踪定位应用程序运行中的问题的一般方法是:
        描述问题。
        跟踪应用程序。
        从出现问题的地方着手,逆向检查系统调用以确定该问题。使用其他途径来获取关于这些系统调用的解释。
        更正应用程序的行为并进行测试。

猜你喜欢

转载自tianyihuyidao9.iteye.com/blog/1490200