客户报告的错误在开发环境中并不总是很容易重现。 应用程序崩溃,挂起和性能降低是常见的例子。 在这种情况下,我们需要可以在客户环境中使用的工具。 本文讨论了一种指导性的调试方法和一些常见问题领域,以及AIX上的可用工具。 请注意,此处不讨论调试性能降低的问题。
出现问题时,我们首先要考虑的是环境:操作系统版本和使用的硬件。 这是重要的一步,因为您可能想检查是否有可重现的环境可以调试,或者您想重新创建精确的环境。
运行prtconf
命令以查看整体系统配置。
#prtconf
System Model: IBM,8204-E8A
Machine Serial Number: 06381D2
Processor Type: PowerPC_POWER6
Number Of Processors: 2
Processor Clock Speed: 4204 MHz
CPU Type: 64-bit
Kernel Type: 64-bit
LPAR Info: 2 ibmmachine
Memory Size: 9344 MB
Good Memory Size: 9344 MB
Platform Firmware level: Not Available
Firmware Version: IBM,EL320_076
Console Login: enable
Auto Restart: true
Full Core: false
以下命令显示AIX的版本,发行版和维护级别。
# instfix -i|grep AIX_ML
All filesets for 5.3.0.0_AIX_ML were found.
All filesets for 5300-01_AIX_ML were found.
All filesets for 5300-02_AIX_ML were found.
All filesets for 5300-03_AIX_ML were found.
All filesets for 5300-04_AIX_ML were found.
All filesets for 5300-05_AIX_ML were found.
All filesets for 5300-06_AIX_ML were found.
All filesets for 5300-07_AIX_ML were found.
# lslpp -h bos.rte
Fileset Level Action Status Date Time
----------------------------------------------------------------------------
Path: /usr/lib/objrepos
bos.rte
5.3.0.50 COMMIT COMPLETE 10/17/07 16:34:57
5.3.0.60 COMMIT COMPLETE 03/11/08 16:08:59
5.3.7.0 COMMIT COMPLETE 03/12/08 11:28:55
# oslevel -r
5300-07
# bootinfo -K
64
# bootinfo -y
64
# lslpp -lc|grep -i perl
/usr/lib/objrepos:perl.libext:2.1.0.10::COMMITTED:I:Perl Library Extensions :
/usr/lib/objrepos:perl.rte:5.8.2.71::COMMITTED:F:Perl Version 5 Runtime Environment:
#uptime
05:16PM up 2 days, 1:36, 4 users, load average: 1.95, 1.90, 1.80
如果程序终止,则取决于终止类型,可能已经生成了一个核心文件。 核心文件是终止进程的映像-崩溃时内存中所有内容的转储。 发生以下任何一种情况时,都会生成一个核心文件:
SIGQUIT
—退出 SIGILL
—无效的指令 SIGTRAP
—跟踪陷阱 SIGIOT
—结束过程 SIGEMT
— EMT指令 SIGFPE
—算术异常,整数除以0或浮点异常 SIGBUS
—规范例外 SIGSEGV
—违反细分 SIGSYS
—参数SIGSYS
例程无效 当应用程序崩溃时,并不总是生成核心文件,或者它们可能不完整。 如果发生这种情况,您可能需要启用核心文件转储或增加核心文件的大小。
#ulimit -c
此命令显示外壳程序核心文件大小的当前值(称为软限制) ,该值适用于从该外壳程序启动的所有进程。 如果为零,请运行以下命令将其增加到最大值,即硬限制: #ulimit -c
。
#ulimit -Hc
编辑/ etc / security / limits文件,并将
分别更改为软核和硬核大小:
core =
将以下内容添加到/ etc / profile中以设置软限制:
#ulimit -S -c > /dev/null 2>&1
chuser attribute=value username
感兴趣的属性:
core
—软限制的大小 core_hard
—硬限制的大小 core_path
—核心文件目录路径启用/禁用 core_pathname
生成核心文件的目录 使用chcore
命令更改设置,使用lscore
查看当前的内核设置。
chdev -l sys0 -a fullcore=true
gencore
实用程序创建每个指定进程的核心映像。 然后可以将其与dbx
类的调试器一起使用。
snapcore
命令收集该程序使用的核心文件,程序和库,然后将信息压缩到PAX文件中。 然后可以将该文件传输到调试环境,并可以用于识别和解决应用程序问题。
snapcore -r
PAX文件在/ tmp / snapcore目录中创建。
如果已创建核心文件,则错误记录过程应记录一个错误日志条目,该条目通常在第一次软件故障发生时启动。
# errpt -a
LABEL: CORE_DUMP
IDENTIFIER: C69F5C9B
Date/Time: Fri Nov 13 17:04:55 IST 2009
Sequence Number: 235168
Machine Id: 000381D2D900
Node Id: ibmmachine
Class: S
Type: PERM
Resource Name: SYSPROC
Description
SOFTWARE PROGRAM ABNORMALLY TERMINATED
Probable Causes
SOFTWARE PROGRAM
User Causes
USER GENERATED SIGNAL
Recommended Actions
CORRECT THEN RETRY
Failure Causes
SOFTWARE PROGRAM
Recommended Actions
RERUN THE APPLICATION PROGRAM
IF PROBLEM PERSISTS THEN DO THE FOLLOWING
CONTACT APPROPRIATE SERVICE REPRESENTATIVE
Detail Data
SIGNAL NUMBER
11
USER'S PROCESS ID:
765972
FILE SYSTEM SERIAL NUMBER
8
INODE NUMBER
352516
CORE FILE NAME
/opt/IBM/InformationServer/Server/Projects/sample1/core
PROGRAM NAME
dsapi_slave
PROGRAM_NAME
提到了生成内核的程序。
要显示过去24小时内记录的所有错误的详细报告,请使用errpt
命令,如下所示:
# date
Fri Nov 13 18:18:33 IST 2009
# errpt -a -s 1112181809
#lquerypv -h core 500 64
The executable is located between the pipes on the right hand side of the output and in
the case below, it is uvsh.
00000500 00000001 00000000 00000043 00000003 |...........C....|
00000510 F1000100 3361BFF8 00000000 00000000 |....3a..........|
00000520 00120000 75767368 00000000 00000000 |....uvsh........|
00000530 00000000 00000000 00000000 00000000 |................|
00000540 00000000 00000000 00000000 5A9E9590 |............Z...|
00000550 00000000 00000016 00000000 00000BF1 |................|
00000560 00000000 00000000 00000000 00001019 |................|
在导致核心转储的二进制可执行文件上运行dbx
。 这将显示违规呼叫。
#dbx exe core
列出sys0
lsattr -El sys0
有用的属性:
autorestart
—崩溃后自动重启系统 fullcore
—启用/禁用全核心转储 maxuproc
—每个用户允许的最大进程数 chdev -l sys0 -a attribute=value
AIX上有许多工具可以检查进程中的应用程序错误,挂起和崩溃。 我们将在这里讨论其中的一些。
以下工具可用于检查相关过程或核心。 所有命令proc
开头。 在生产环境中检查过程时应格外小心,因为这些工具在检查时实际上会停止过程:
procstack
打印该进程的堆栈跟踪。 procflags
打印挂起和保留的信号。 procsig
打印该过程的信号动作和处理程序。 procfiles
报告每个进程中所有打开的文件的fstat
和fcntl
信息。 procwdx
显示进程procstop
的当前工作目录, procrun
以停止并运行已停止的进程。 proctree
打印包含指定进程ID(PID)或用户的进程树,以及从各自父进程缩进的子进程。 truss
命令会跟踪执行的系统,接收到的信号以及由此引起的机器故障。 默认情况下,不跟踪用户级功能。 要为所有用户级功能启用跟踪,请使用truss -u '*' -p
。
有用的选项:
-p
提供PID。 -u [!] [LibraryName [...]::[!]FunctionName [...] ]
跟踪从用户库动态加载的用户级函数调用。 -a
显示在每个exec()
系统调用中传递的参数字符串。 -f
跟随由fork()
或vfork()
创建的所有子代,并在跟踪输出中包括其信号,故障和系统调用。 -m [!]Fault
跟踪进程中列出的(请参见sys / procfs.h头文件)计算机故障。 -s [!] Signal
允许列出要跟踪或排除的信号。 truss
一个SUID进程 要truss
以另一个用户身份在SUID下运行的命令,将不允许您这样做,因为系统会将其标识为不属于您的用户。 显示以下错误:
# truss -deaf -o truss.out program
truss: 0915-015 Cannot create subject process.
wait4all: i: 0, status: 32512, pid: 643282, created: 0
truss
这样的命令:
ps
命令查找您的Shell的PID。 truss
shell会话。 truss
。 可以调查truss.out文件以查找故障。 在典型的数据库系统环境或广泛使用文件处理的应用程序中,了解调试问题的进程所拥有的文件名可能很重要。
procfiles -n
inode
号,则:
ncheck
从ncheck
inode
编号生成路径名 ncheck - i
inode
的文件和grep
ls -ail |grep
netstat -a |grep
如果客户端进程状态字段长时间处于FIN_WAIT
状态,或者服务器进程状态字段长时间处于CLOSE_WAIT
,则表示进程已挂起,否则可能发生死锁 。
运行netstat -Aan
,其中-A显示与套接字关联的任何协议控制块的地址。
#netstat -Ana|grep 31538
f10006000041c398 tcp4 0 0 *.31538 *.* LISTEN
f10006000677d398 tcp4 0 0 9.122.87.107.31538 9.122.87.51.2500 ESTABLISHED
f100060006affb98 tcp4 0 0 9.122.87.107.31538 9.122.87.51.2511 ESTABLISHED
f1000600066d1398 tcp4 0 0 9.122.87.107.31538 9.122.87.51.2521 ESTABLISHED
运行kdb
并在有问题的套接字的地址上发出sockinfo
。
kdb
(0)> sockinfo f10006000677d398 tcpcb
---- TCPCB ----(@ F10006000677D398)----
seg_next......@F10006000677D398 seg_prev......@F10006000677D398
t_softerror... 00000000 t_state....... 00000004 (ESTABLISHED)
t_timer....... 00000000 (TCPT_REXMT)
....
proc/fd: fd: 4
SLOT NAME STATE PID PPID ADSPACE CL #THS
pvproc+01B000 108*dsapi_sl ACTIVE 006C0D0 00B206C 000000002E707590 0 0001
#ps -fp
检查时间字段。 如果时间恒定,则可能发生死锁或挂起。
#ps -mp
LDR_CNTRL
环境变量控制一个进程可以使用的数据段数。 以下示例定义了一个附加的数据段:
export LDR_CNTRL=MAXDATA=0x10000000
start the process
unset LDR_CNTRL
该值极大地影响了AIX上一些与内存有关的问题。 MAXDATA
控制的量malloc
d存储器,并且MAXDATA
使用改变LDR_CNTRL=MAXDATA=0xN0000000
(其中N等于段的数量)。
在32位系统上,默认地址空间模型是它使用单个段存储用户和堆栈数据,最大聚合大小接近256 MB。 如果您的应用程序要求更多,则可以通过设置MAXDATA
来使用大型或大型地址空间模型。
有关大程序支持的更多信息,请参阅AIX文档。
ldedit
命令还可用于更改可执行文件本身中的MAXDATA
设置。
ldedit -bmaxdata:0x80000000 sampleexec
对于大型地址空间模型下的32位程序,允许的最大值为0x80000000; 在非常大的地址空间模型下,该值为0xD0000000。 对于64位程序,可以指定任何值,但是数据区不能扩展0x06FFFFFFFFFFFFFFF8。
ps
命令报告malloc
d内存,并且不包括mmap
d内存。 svmon
报告完整的进程内存利用率。
#svmon -P -m -r -i
默认情况下,内存和调页空间分配晚。 PSALLOC
环境变量控制分配机制。
#export PSALLOC=early
默认情况下,当调用malloc
时,直到被引用之前,才分配调页空间。 malloc
可能会过量使用,某些其他进程可能会在当前进程之前获取资源,从而导致失败。 将PSALLOC
设置为“ early”可以保证内存分配请求所请求的调页空间。
要打印有关活动的共享内存段的信息,请使用: #ipcs -mop
。 要删除共享内存段,请使用: ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ]
。
您已经了解了可以在客户环境中使用的一些工具,这些工具可以帮助调试问题。 我们已经讨论了一种指导性的调试方法和一些常见问题领域,以及可用的AIX工具。
翻译自: https://www.ibm.com/developerworks/aix/library/au-debugtools/index.html