aix调试命令_辅助在AIX上进行调试的工具

客户报告的错误在开发环境中并不总是很容易重现。 应用程序崩溃,挂起和性能降低是常见的例子。 在这种情况下,我们需要可以在客户环境中使用的工具。 本文讨论了一种指导性的调试方法和一些常见问题领域,以及AIX上的可用工具。 请注意,此处不讨论调试性能降低的问题。

AIX环境

出现问题时,我们首先要考虑的是环境:操作系统版本和使用的硬件。 这是重要的一步,因为您可能想检查是否有可重现的环境可以调试,或者您想重新创建精确的环境。

系统配置

运行prtconf命令以查看整体系统配置。

清单1.总体系统配置
#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的版本,发行版和维护级别。

清单2. 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

CPU和内核类型

清单3. CPU和内核类型
# bootinfo -K
64
# bootinfo -y
64

已安装的软件产品

清单4.已安装的软件产品
# 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 = core_hard =

在系统范围内设置软限制的替代方法

将以下内容添加到/ 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目录中创建。

确定在何处创建核心文件以及导致该文件的程序

如果已创建核心文件,则错误记录过程应记录一个错误日志条目,该条目通常在第一次软件故障发生时启动。

  1. 检索错误日志
    清单5.错误日志检索
    # 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提到了生成内核的程序。

  2. 参照时间显示错误

    要显示过去24小时内记录的所有错误的详细报告,请使用errpt命令,如下所示:

    # date
    Fri Nov 13 18:18:33 IST 2009
    # errpt -a -s 1112181809

哪个应用程序创建了核心?

清单6.创建核心的应用程序
#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报告每个进程中所有打开的文件的fstatfcntl信息。
  • 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。
  • 以root用户身份启动一个新会话,并truss shell会话。
  • 这个新会话将所有活动记录在原始Shell中。 运行失败的命令并停止truss 。 可以调查truss.out文件以查找故障。

知道进程打开的文件的名称

在典型的数据库系统环境或广泛使用文件处理的应用程序中,了解调试问题的进程所拥有的文件名可能很重要。

  1. 列出该进程拥有的文件的名称:
    procfiles -n 
  2. 如果您知道inode号,则:
    • ncheckncheck inode编号生成路径名
      ncheck - i 
    • 列出inode的文件和grep
      ls -ail |grep 

连接或接受TCP连接时进程挂起

netstat -a |grep 

如果客户端进程状态字段长时间处于FIN_WAIT状态,或者服务器进程状态字段长时间处于CLOSE_WAIT ,则表示进程已挂起,否则可能发生死锁 。

套接字到进程的ID映射

运行netstat -Aan ,其中-A显示与套接字关联的任何协议控制块的地址。

清单7.套接字到进程的ID映射
#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

清单8.运行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

检查CPU使用率是否挂起

#ps -fp

检查时间字段。 如果时间恒定,则可能发生死锁或挂起。

#ps -mp -o THREAD

处理过程存储器的工具

数据段设置

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

你可能感兴趣的:(python,linux,java,操作系统,大数据)