`
netcome
  • 浏览: 479537 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AIX 调试工具

    博客分类:
  • AIX
阅读更多

From developerWokrs

 

简介

客户报告的 bug 不一定能够在开发环境中轻松地重现。应用程序崩溃、挂起和性能低下都可能无法重现。在这种情况下,需要可以在客户环境中使用的调试工具。本文讨论一种调试方法和一些常见的问题领域,以及 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

调试应用程序崩溃的工具

如果一个程序终止了,根据终止类型,可能会生成核心文件(core file)。核心文件 是终止的进程的映像,即当进程崩溃时内存中所有数据的转储。当发生以下事件时会生成核心文件:

  • SIGQUIT — 退出
  • SIGILL — 无效的指令
  • SIGTRAP — 跟踪捕捉
  • SIGIOT — 结束进程
  • SIGEMT — EMT 指令
  • SIGFPE — 算术异常、整数被零除或浮点异常
  • SIGBUS — 规格异常
  • SIGSEGV — 分割违例
  • SIGSYS — 参数对于子例程无效

在应用程序崩溃时,不一定会生成核心文件,核心文件还可能不完整。在这种情况下,可能需要启用核心文件转储或增加核心文件大小。

检查核心文件大小

#ulimit -c

这个命令显示 shell 核心文件大小的当前值(软限制),这个值应用于从这个 shell 启动的所有进程。如果这个值是零,那么执行以下命令把它提高到最大值(硬限制 ):#ulimit -c <val>

检查核心的硬限制

#ulimit -Hc

设置全系统范围的核心限制

编辑 /etc/security/limits 文件,修改软和硬核心大小的 <value>

core = <value>
core_hard = <value>

设置全系统范围的软限制的其他方法

在 /etc/profile 中添加以下设置以设置软限制:

#ulimit -S -c <value> > /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<core file name> <program name>

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. 显示错误和相应的时间

    可以使用 errpt 命令显示过去 24 小时内所有错误的详细报告:

    # 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<cmd> 开头。在生产环境中检查进程时应该特别小心,因为这些工具在进行检查时实际上会停止进程。

  • procstack 输出进程的堆栈跟踪。
  • procflags 输出进程的未处理信号和持有的信号。
  • procsig 输出进程的信号操作和处理程序。
  • procfiles 报告每个进程中所有打开的文件的 fstat 和 fcntl 信息。
  • procwdx 输出分别用于停止和重新运行进程的 procstop 和 procrun 的当前工作目录。
  • proctree 输出包含指定进程 ID (PID) 或用户的进程树,子进程相对于父进程缩进显示。

观察进程

truss 生成跟踪信息,包括进程执行的系统调用、它收到的信号和它导致的机器错误。在默认情况下,不跟踪用户级函数。可以使用truss -u '*' -p <pid> 启用对所有用户级函数的跟踪。

有用的选项:

  • -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 <pid>
    

  2. 如果知道 inode 号,那么:
    • 使用 ncheck 根据 inode 号生成路径名
         
      	ncheck - i <inode>
      

    • 列出文件并使用 grep 搜索 inode
      	ls -ail |grep <inode>

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

netstat -a |grep <process name>

如果客户机进程状态字段长时间处于 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 <pid> 

查看 time 字段。如果它长时间不变,那么很可能是发生了死锁或挂起。

#ps -mp <pid> -o THREAD 

检查进程内存的工具

数据段设置

LDR_CNTRL 环境变量控制进程可以使用的数据段数量。下面的示例定义一个额外的数据段:

export LDR_CNTRL=MAXDATA=0x10000000
start the process
unset LDR_CNTRL

这个值会显著影响 AIX 上一些与内存相关的问题。MAXDATA 控制 malloc 分配的内存量,使用 LDR_CNTRL=MAXDATA=0xN0000000 修改MAXDATA(其中的 N 等于数据段数量)。

在 32 位系统上,默认的地址空间模型是对于用户和堆栈数据使用单一数据段,最大总大小接近 256 MB。如果应用程序需要更多内存,可以通过设置 MAXDATA 使用较大或非常大的地址空间模型。

关于大程序支持的更多信息参见 AIX 文档。

还可以使用 ldedit 命令在可执行程序中修改 MAXDATA 设置。

ldedit -bmaxdata:0x80000000 sampleexec

对于大地址空间模型下的 32 位程序,允许的最大值是 0x80000000;对于非常大的地址空间模型,是 0xD0000000。对于 64 位程序,可以指定任何值,但是数据区域不能超过 0x06FFFFFFFFFFFFF8。

进程的内存使用量

ps 命令报告 malloc 分配的内存,但是不包含 mmap 分配的内存。svmon 报告完整的进程内存使用情况。

#svmon -P <pid> -m -r -i <interval>

晚分配和早分配

在默认情况下,内存和分页空间采用晚分配。PSALLOC 环境变量控制分配机制。

#export PSALLOC=early

在默认情况下,当调用 malloc 时并不分配分页空间,而是到引用它时才分配。malloc 可能会过量分配内存,其他进程可能在当前进程之前获得资源,这会导致错误。把 PSALLOC 设置为 “early” 可以保证进程获得内存分配请求所请求的分页空间。

共享内存设置

使用 #ipcs -mop 输出关于活跃共享内存段的信息。使用 ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ] 删除共享内存段。

结束语

本文讨论了可以在客户环境中帮助调试问题的一些工具。还讨论了一种调试方法和一些常见的问题领域,以及可用的 AIX 工具。


分享到:
评论

相关推荐

    aix 优化及维护案例

    aix 优化及维护案例--来自aixchina.net 1 系统优化篇 3 1.1 AIX 5L 内存性能优化之AIX Version 5.3 中内存的概述以及内存参数的优化 3 1.2 AIX 5L 内存性能优化之使用 ps、sar、...5 AIX调试工具的介绍与使用详解 183

    《AIX5.3通用编程概念:编写并调试程序》

    - **调试工具使用**:深入学习AIX提供的调试工具,了解如何利用这些工具有效地定位问题所在。 - **日志记录**:学会如何在程序中添加日志记录功能,这对于后期的问题排查非常有帮助。 #### 5. **案例分析** - ...

    AIX优化及维护案例

    #### 五、AIX调试工具的介绍与使用详解 AIX提供了丰富的调试工具,如`dbx`和`gdb`,用于调试应用程序;`diag`用于硬件诊断;`strace`和`ptrace`用于跟踪系统调用等,帮助管理员和开发者快速定位和解决问题。 以上...

    AIX_性能调整及维护案例2011.pdf

    最后,这部分内容详细介绍了 AIX 中可用的调试工具及其使用方法。这些工具对于诊断和解决系统问题非常有帮助,是系统管理员不可或缺的工具集。 综上所述,这份文档全面而详细地覆盖了 AIX 性能调整及维护的各个方面...

    aix基础学习

    编程工具包括编辑器、源代码控制系统(SCCS)、调试工具和代码检查工具(lint)。 AIX系统管理为系统管理员提供了管理系统的多种方法,包括软件安装、用户管理、设备配置、存储管理、数据备份、性能监控和问题诊断。...

    IBM官方AIX模拟器

    3. **软件开发与调试**:对于AIX平台上的应用程序开发者,模拟器提供了一个安全的环境来编译、测试和调试代码,避免了在生产环境中可能出现的问题。 4. **系统培训**:教育机构或个人学习者可以利用模拟器进行AIX...

    AIX JDK1.8 64位

    其中,JRE使得用户能够在AIX系统上执行Java程序,而SDK则提供了编译、调试和性能分析等开发所需工具。 在提供的压缩包文件中,有两个重要的组件: 1. **Java8_64.jre.8.0.0.610.tar.gz**:这是Java 8的64位运行时...

    AIX原文官方文档(aix5.3)

    6. **故障诊断与日志分析**:系统日志文件、错误消息和调试工具都是排查问题的重要资源。文档会教授如何解读这些信息,以及使用`troubleshoot`、`errpt`等工具进行故障诊断。 7. **性能调优**:针对CPU、内存、I/O...

    IBM AIX系列培训\IBM AIX系列培训 - 14 AU13第十三章 介绍AIX的一些工具Utilities.zip

    【IBM AIX系列培训 - 14 AU13第十三章 介绍AIX的一些工具Utilities】 在IBM AIX操作系统环境中,掌握一系列实用工具是至关重要的,这些工具可以帮助系统管理员高效地管理和维护系统。本章主要关注的是AIX系统中的...

    AIX JDK1.8 JRE1.8 32位

    JDK,Java Development Kit,是Java编程语言的软件开发工具包,包含了编译器、调试器、文档、JRE以及各种工具,用于编写、测试和部署Java应用程序。JDK1.8是Java的一个重要版本,它引入了Lambda表达式、Stream API、...

    Aix工作总结-Makefil,oracle,dbx,aix安装和使用心得

    然后是dbx,它是AIX系统下强大的C/C++调试工具。通过dbx,开发者可以设置断点、查看内存、单步执行代码,从而定位和修复程序中的错误。掌握dbx的使用能有效提高问题诊断效率,对于理解程序运行逻辑和调试复杂问题尤...

    AIX.rar_AIX CHM_AIX unix c++_aix_aix c_aix.chm

    4. **调试工具**:IBM提供dbx,一个强大的源代码级调试器,用于C++程序的调试。 AIX中的C语言编程: 1. **编译器**:xlC是AIX的C编译器,支持ANSI C和C99标准。 2. **系统调用**:AIX提供了丰富的系统调用来实现...

    AIX-JDK8-JRE8_64位.rar

    JDK(Java Development Kit)是开发和调试Java应用程序所需的一套工具,包括编译器、调试器、文档生成器以及其他实用工具。JRE(Java Runtime Environment)则是运行Java应用程序所必需的环境,它包含Java虚拟机...

    AIX基础--入门级

    6. **编程工具和编程语言**:AIX支持多种编程语言,如C、C++、Fortran和Pascal,并配有源代码控制系统(如SCCS)、调试工具和代码检查工具(如lint),为开发人员提供了一套完整的开发环境。 7. **系统管理**:AIX...

    dbx调试手册.pdf

    DBX是Unix系统下的一款功能强大的源码级动态调试工具,主要用于C、C++、Pascal、FORTRAN等语言编写的程序的调试。它允许用户单步执行程序、设置断点、检查变量值、跟踪函数调用等,帮助开发者快速定位并修复代码中的...

    AIX-6.1-通用编程概念-编写并调试程序(中、英版都有)

    在AIX上进行程序开发,开发者需要熟悉其特有的编译器、链接器以及调试工具。例如,`xlc`和`xlC`是IBM提供的C和C++编译器,它们提供了对AIX特性的良好支持。此外,`dbx`是AIX上的标准调试器,用于查找和修复代码中的...

    AIX_pstack

    总之,"AIX_pstack"和"pstack.sh"是AIX系统管理员和开发者不可或缺的调试工具。掌握它们的使用不仅可以帮助排查系统故障,还能提升系统监控和维护的能力。在日常工作中,应不断实践和熟悉这些工具,以便在面临复杂...

Global site tag (gtag.js) - Google Analytics