flyzebra

AIX下core文件的分析

笔者曾在AIX系统下使用C语言开发多个应用系统。众所周知,C语言编写程序时容易出现内存使用不当的BUG,例如内存越界、使用野指针、内存未初始化等等。在程序运行时,这些BUG很可能造成程序崩溃,但在测试时往往又无法重现问题。此类问题往往让开发者大伤脑筋,在老板和客户的追杀下无地自容,恨不得一死了之。

image

幸好,当程序崩溃时,AIX会自动产生一个core文件,该文件保存了进程崩溃时的运行环境,包括当时的函数调用堆栈、栈内存、堆内存等。

将core文件复制到开发环境,使用命令

$ file core

可显示core文件是由哪个进程产生。

将core文件与该进程的文件放到同一路径下,使用命令

$ dbx 进程文件

即可进入dbx调试器,并将此进程文件产生的core文件打开。

此时使用dbx命令

> where

可看到当前的函数调用堆栈(如果调用堆栈还没有被破坏),即可知道程序运行到哪个函数时崩溃了。如果编译时使用了 –g 参数,则还可以看到源码文件名与行序号。

如果出现内存越界的错误,往往调用堆栈已被破坏,此时使用 where 命令看不到调用的函数。这种情况下往往会让大多数程序员束手无策。不过,我们仍然可以通过分析core文件中的内容,获得进程崩溃时的运行数据。在dbx中使用命令

> coremap

可看到此core文件中当前的内存布局。

posted on 2017-09-17 16:56  flyzebra  阅读(2991)  评论(0编辑  收藏  举报