AIX+下的+core+dump+分析.docx
- 文档编号:30155221
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:39
- 大小:36.07KB
AIX+下的+core+dump+分析.docx
《AIX+下的+core+dump+分析.docx》由会员分享,可在线阅读,更多相关《AIX+下的+core+dump+分析.docx(39页珍藏版)》请在冰豆网上搜索。
AIX+下的+core+dump+分析
本文简要介绍了AIX平台下coredump产生的原理以及相关定位方法。
Coredump基本知识
本节主要探讨coredump产生的背景知识。
对这部分不感兴趣的读者可以直接阅读第二章,了解基本的coredump定位手段。
起源
软件是人思维的产物。
智者千虑,必有一失,人的思维总有缺陷,反映到软件层面上就是程序bug。
程序bug的终极体现就是coredump,coredump是软件错误无法恢复的产物。
生成过程
进程coredump与系统dump的产生,从程序原理上来说是基本一致的。
dump的生成一般是在系统进行中断处理时进行的,下面简单介绍一下中断机制。
操作系统的中断机制
操作系统是由中断驱动的。
广义的中断一般分为两类,中断(Interrupts)和异常(Exceptions)。
中断可在任何时候发生,与CPU正在执行什么指令无关,中断主要由I/O设备、处理器时钟(分时系统依赖时钟中断划分时间片)或定时器等硬件引发,可以被允许或取消。
而异常是由于CPU执行了某些指令引起的,可以包括存储器存取违规、除0或者特定调试指令等,内核也将系统服务视为异常。
系统对这两类中断的处理基本上是相同的。
每个中断都会唯一对应到一个中断处理程序,在该中断触发时,相应的处理程序就会被执行。
例如应用进程进行系统调用时,就会触发一个软件异常,进入中断处理函数,完成从用户态到系统态的迁移并进入相应系统调用的入口点。
应用进程coredump也是一个类似的过程。
应用进程coredump生成过程
在进程运行出现异常行为时,例如无效地址访问、浮点异常、指令异常等,将导致系统转入内核态进行异常处理(即中断处理),向相应的进程发出特定信号例如SIGSEGV、SIGFPE、SIGILL等。
如果应用进程注册了相应信号的处理函数(例如可通过sigaction注册信号处理函数),则调用相应处理函数进行处理(应用程序可以选择记录信息后生成coredump并退出);否则将采取默认动作,例如SIGSEGV的默认动作是生成coredump并退出程序。
进程coredump的时候,操作系统会将进程终止并释放其占用的资源,正常情况下,应用进程coredump不会对系统本身的运行造成危害。
当然如果系统中存在与此进程相关的其他进程,则这些进程会受到影响,至于后果则视其对此异常的具体处理而定。
由于相关指令已经包含在可执行文件中,core文件一般只包含进程异常时相关的内存信息。
其格式可参考/usr/include/sys/core.h或者AIX帮助文档的“FilesReference”章节。
我们一般需要结合core文件以及可执行程序,来分析问题所在。
注:
由于进程信号处理本质上是异步的,应用进程注册的信号处理函数中使用的例程需要保证是异步信号安全的,例如不能使用诸如pthread_开头的例程。
系统dump生成过程
系统异常dump的具体过程与应用进程类似,但由于更接近底层,为了避免问题所在的资源(例如文件系统)正好包含在生成dump需要使用的资源中,造成dump无法生成,操作系统一般会用最简单的方式来生成dump。
例如系统内存小于4G的情况下,一般直接将dump生成在pagingspace中;大于4G时,会建专门的lg_dumplv逻辑卷(裸设备)保存dump信息。
在系统重启的时候,如果设置的DUMP转存目录(文件系统中的目录)有足够空间,它将会转存成一个文件系统文件,缺省情况下,是/var/adm/ras/下的vmcore*这样的文件。
系统dump一般可以通过升级微码、提高系统补丁级别、升级驱动等方式解决。
应用进程coredump分析
上一章我们介绍了coredump产生的基本原理。
本章我们将针对AIX操作系统,介绍coredump定位相关的背景知识。
环境变量设置
可以通过/etc/security/limits文件对各用户的基本配置参数包括core大小进行限制。
或者通过ulimit更改当前环境下的core大小限制。
默认情况下,应用进程生成coredump时都使用文件名core。
为了避免同一工作目录下的进程core相互覆盖,可以定义环境变量CORE_NAMING=true,然后启动进程,这样将生成名为core.pid.ddhhmmss的文件。
可以使用filecore命令查看core是哪个进程产生的。
默认情况下,应用进程dump时会包含所有的共享内存,如果dump时想排除共享内存内容,可以在启动进程之前设置环境变量CORE_NOSHM=true.
系统有一个参数fullcore用于控制是否在程序coredump时生成完整的core。
为避免信息丢失,建议打开fullcore。
可以使用lsattr–Elsys0查询是否将fullcore打开,使用chdev-lsys0-afullcore=true将fullcore状态更改为打开。
也可以在程序内部调用sigaction例程设置fullcore,参考如下测试程序:
fullcore设置示例
//test.C
#include
#include
intmain(intargc,char*argv[])
{
charstr[10];
structsigactions;
s.sa_handler=SIG_DFL;
s.sa_mask.losigs=0;
s.sa_mask.hisigs=0;
s.sa_flags=SA_FULLDUMP;
sigaction(SIGSEGV,&s,(structsigaction*)NULL);
std:
:
cout<<"inputstr!
\n"< : endl; std: : cin>>str; return0; } 寻找coredump 应用进程的core产生在其当前工作目录下,可以在应用程序内部使用chdir函数切换当前工作目录。 使用procwdx命令可以查看进程的当前工作目录。 系统的core生成在lg_dumplv下,并在重启时转移到/var/adm/ras/目录下(如果有足够空间的话,否则继续保留在lg_dumplv,并随时有可能被覆盖)。 可以使用errpt-a查看标识C0AA5338SYSDUMP(系统core)、B6048838CORE_DUMP(进程core)的详细错误信息,获取生成core的进程以及core文件位置。 使用snap–ac收集系统的dump信息。 coredump信息收集 如果可能,直接在发生coredump的机器上用dbx分析出结果,这样是最方便的分析方法.这种情况下注意不要直接以root用户登录然后用dbx分析,而必须在应用程序所属的用户下进行此操作,因为core可能需要依赖应用程序运行时对应环境下的某些库,这样就要借助应用程序的环境变量. 如果需取回生产机上的core信息在实验室分析,则需要搜集一些相关信息.进程core分析一般至少需要依赖应用可执行程序,有时还需要包括一些运行时动态库信息。 如果需要收集core相关的完整信息,可运行snapcore 正常的收集过程应该如下: snapcore收集过程 #snapcore./core./a.out Corefile"./core"createdby"a.out" pass1()inprogress.... Calculatingspacerequired. Totalspacerequiredis14130kbytes.. Checkingforavailablespace... Availablespaceis807572kbytes pass1complete. pass2()inprogress.... Collectingfilesetinformation. CollectingerrorreportofCORE_DUMPerrors.. Creatingreadmefile.. Creatingarchivefile... Compressingarchivefile.... pass2completed. Snapcorecompletedsuccessfully.Archivecreatedin/tmp/snapcore. #cd/tmp/snapcore #ls snapcore_352276.pax.Z #uncompresssnapcore_352276.pax.Z #ls snapcore_352276.pax #pax-r-fsnapcore_352276.pax #ls注意需要保证有类似如下文件(可执行文件,/core/errpt/lslpp/usr目录等): READMEerrpt.outusr a.outlslpp.out coresnapcore_352276.pax # 使用dbx分析coredump的例子 dbx是AIX下基于命令行界面的源码级调试工具。 本文档只提供一些基本的dbx分析指令,详细内容请参考“GeneralProgrammingConcepts: WritingandDebuggingPrograms”关于dbx的描述。 初步分析 #dbx 示例: #dbx./testcore Type'help'forhelp. warning: Thecorefileisnotafullcore.Someinfomay notbeavailable. [usingmemoryimageincore] readingsymbolicinformation...warning: nosourcecompiledwith-g Segmentationfaultinraiseat0xd022e1e4 0xd022e1e4(raise+0x40)80410014lwzr2,0x14(r1) 显示出core发生时,当前进程执行到的位置(-g编译的情况下能够看到具体的行): (dbx)where raise(? ? )at0xd022e1e4 main(0x1,0x2ff22d48)at0x100019c4 注意: 如果分析的是异地core文件,需要采用snapcore收集相关core信息。 对于依赖链接库的情况,注意需要增加-poldpath=newpath: ...重新设置链接库路径(只有所有依赖的库都已经被链接,才能完整的复现coredump故障现场),参考dbx的帮助文档获取更多信息。 #cd/tmp/snapcore #dbx–p/=./a.outcore Type'help'forhelp. [usingmemoryimageincore] readingsymbolicinformation...warning: nosourcecompiledwith-g IOT/Aborttrapinraiseat0xd01f4f60 0xd01f4f60(raise+0x40)80410014lwzr2,0x14(r1) 列举源码信息 列举程序源码(list,需要在运行dbx命令时使用-I指明源码搜索路径,并使用-g编译)或者汇编码(listi): (dbx)listimain 0x10001924(main)7c0802a6mflrr0 0x10001928(main+0x4)bfa1fff4stmwr29,-12(r1) 0x1000192c(main+0x8)90010008stwr0,0x8(r1) 0x10001930(main+0xc)9421ffa0stwur1,-96(r1) 0x10001934(main+0x10)83e20064lwzr31,0x64(r2) 0x10001938(main+0x14)90610078stwr3,0x78(r1) 0x1000193c(main+0x18)9081007cstwr4,0x7c(r1) 0x10001940(main+0x1c)83a20068lwzr29,0x68(r2) 列举变量内容 示例代码: #include #include intg_test=0; inttestfunc(int¶) { para++; return0; } intmain(intargc,char*argv[]) { structsigactions; s.sa_handler=SIG_DFL; s.sa_mask.losigs=0; s.sa_mask.hisigs=0; s.sa_flags=SA_FULLDUMP; sigaction(SIGSEGV,&s,(structsigaction*)NULL); charstr[10]; g_test=0; testfunc(g_test); abort(); } #xlCtest.C-g 以全局变量g_test举例: #printg_test显示g_test的取值 #printsizeof(g_test)显示g_test的大小 #whatisg_test显示g_test的类型 #print&g_test显示g_test的地址 #&g_test/16x显示从g_test的地址开始处,连续16个WORD(? byte)的取值 如果没有使用-g编译,则不能动态获取g_test的类型、大小等信息,但能够得到g_test的地址,并查询该地址所在区域存储空间的值。 例如: #./a.out IOT/Aborttrap(coredump) #dbx./a.outcore Type'help'forhelp. [usingmemoryimageincore] readingsymbolicinformation... IOT/Aborttrapinraiseat0xd03365bc 0xd03365bc(raise+0x40)80410014lwzr2,0x14(r1) (dbx)printg_test 1 (dbx)whatisg_test intg_test; (dbx)printsizeof(g_test) 4 (dbx)print&g_test 0x20000428 (dbx)&g_test/16x 0x20000428: 00000001000000000000000000000000 0x20000438: 00000000000000000000000000000000 列举寄存器内容 列举寄存器内容: (dbx)registers 如下模拟一个简单的coredump,对0地址赋值引发coredump的问题: #dbx./a.outcore Type'help'forhelp. warning: Thecorefileisnotafullcore.Someinfomay notbeavailable. [usingmemoryimageincore] readingsymbolicinformation...warning: nosourcecompiledwith-g Segmentationfaultinmainat0x10000348 0x10000348(main+0x18)90640000stwr3,0x0(r4) (dbx)where main(0x1,0x2ff22ccc)at0x10000348 (dbx)registers $r0: 0x00000000$stkp: 0x2ff22bf0$toc: 0x20000414$r3: 0x00000012 $r4: 0x00000000$r5: 0x2ff22cd4$r6: 0xdeadbeef$r7: 0x2ff22ff8 $r8: 0x00000000$r9: 0x04030000$r10: 0xf0577538$r11: 0xdeadbeef $r12: 0xdeadbeef$r13: 0xdeadbeef$r14: 0x00000001$r15: 0x2ff22ccc $r16: 0x2ff22cd4$r17: 0x00000000$r18: 0xdeadbeef$r19: 0xdeadbeef $r20: 0xdeadbeef$r21: 0xdeadbeef$r22: 0xdeadbeef$r23: 0xdeadbeef $r24: 0xdeadbeef$r25: 0xdeadbeef$r26: 0xdeadbeef$r27: 0xdeadbeef $r28: 0xdeadbeef$r29: 0xdeadbeef$r30: 0xdeadbeef$r31: 0xdeadbeef $iar: 0x10000348$msr: 0x0000d0b2$cr: 0x22282489$link: 0x100001b4 $ctr: 0xdeadbeef$xer: 0x20000020 Conditionstatus=0: e1: e2: e3: l4: e5: g6: l7: lo [unset$noflregstoviewfloatingpointregisters] [unset$novregstoviewvectorregisters] inmainat0x10000348 0x10000348(main+0x18)90640000stwr3,0x0(r4) (dbx)print$r3 0x00000012 (dbx)print$r4 (nil) 这个例子比较简单,从最后汇编指令“stwr3,0x0(r4)”就可以简单的看到程序coredump是因为向0地址(0+r4)存入18(r3寄存器值)造成。 查看多线程相关信息 如果以下环境变量采用默认的OFF值,则系统会完全禁止适当的调试列表,这意味着dbx命令将显示不出任何对象: AIXTHREAD_MUTEX_DEBUG AIXTHREAD_COND_DEBUG AIXTHREAD_RWLOCK_DEBUG 可以使用 exportAIXTHREAD_MUTEX_DEBUG=ON 打开AIXTHREAD_MUTEX_DEBUG。 ∙查看线程信息 (dbx)print$t1//打印t1线程的基本信息 (dbx)attribute (dbx)condition (dbx)mutex (dbx)rwlock (dbx)thread 例如: (thread_id=1,state_u=4,priority=60,policy=other,attributes=0x20001078) ∙切换当前线程(默认当前线程为收到core触发信号所在线程) (dbx)threadcurrent[tid] 例如(>表明coredump时的当前线程): (dbx)thread threadstate-kwchanstate-uk-tidmodeheldscopefunction $t1wait0x31bbb558running10321knopro_ptrgl $t2wait0x311fb958running6275knopro_ptrgl >$t3runrunning6985knopro_p_nsleep $t4wait0x31bbbb18running6571knopro_ptrgl $t5wait0x311fb9d8running7999knopro_ptrgl $t6wait0x31bf8f98running8257knopro_ptrgl $t7wait0x311fba18running8515knopro_ptrgl $t8wait0x311fb7d8running8773knopro_ptrgl $t9wait0x311fbb18running9031knopro_ptrgl $t10wait0x311fb898running9547knopro_ptrgl $t11wait0x311fb818running9805knopro_ptrgl $t12wait0x311fba58running10063knopro_ptrgl $t13wait0x311fb8d8running10579knopro_ptrgl (dbx)threadcurrent3 (dbx)where _p_nsleep(? ? ? ? )at0xd005f740 raise.nsleep(? ? ? ? )at0xd022de3c sleep(? ? )at0xd0260344 helper(? ? )at0x100005ac (dbx)threadcurrent4 warning: Threadisinkernelmode,notallregisterscanbeaccessed. (dbx)where ptrgl._ptrgl()at0xd020e470 raise.nsleep(? ? ? ? )at0xd022de3c raise.nsleep(? ? ? ? )at0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AIX core dump 分析