C开发手记系列一:
解决aix下的core问题
今天收到了生产运维的紧急QC问题,一个数据抽取接口的tuxedo服务core掉了。
使用dbx命令查看core内容为:
$ dbx custnpa Type 'help' for help. warning: The core file is not a fullcore. Some info may not be available. [using memory image in core] reading symbolic information ... Segmentation fault in pthread_kill at 0x9000000005bd71c 0x9000000005bd71c (pthread_kill+0x88) e8410028 ld r2,0x28(r1) (dbx) where pthread_kill(??, ??) at 0x9000000005bd71c _p_raise(??) at 0x9000000005bd130 skgesigOSCrash(??) at 0x900000000ec16fc kpeDbgSignalHandler(??, ??) at 0x900000000f2db18 skgesig_sigactionHandler(??, ??, ??) at 0x900000000ec1a84 noname.strlen() at 0x900000000056100 _doprnt(??, ??, ??) at 0x90000000004b43c sprintf(0xffffffffff1b590, 0x9001000a4a48fd0, 0x32333c2f42697274, 0x74, 0xffffffff80808080, 0x6e743e00, 0x43, 0xfffffffffff3348) at 0x900000000049038 cfc_GetNodeSet(strTag = warning: Unable to access address 0x32333c2f42697274 from core (invalid char ptr (0x32333c2f42697274)), strXml = warning: Unable to access address 0x68446174653e3c49 from core (invalid char ptr (0x68446174653e3c49)), stNodeSet = 0x644e6f3e33353032, errstr = warning: Unable to access address 0x3132323030353132 from core (invalid char ptr (0x3132323030353132))), line 33 in "xxxxxxxx.pc" (dbx)
初步可以定位到错误程序段。
1,在本地写了个tuxedo client端模拟程序调用服务,服务正常调用,也未core掉,也未见异常。,
2,查看代码也无不正确的操作。
3,因为该数据接口数据量较大,怀疑为内存溢出引起访问的错误。
4,在模拟客户端增加十倍的数据量。错误重现,果然是数据量过大的问题。
5,遂将函数中的几个临时变量调大十倍,再用客户端试了一下,一切正常。
总结:
此问题虽然最终解决方案很简单,但在定位错误的时候走了不少弯路,特别是运维人员未提供有core信息的时候,根本无从下手。
在此,一方面可以看出,在系统生产运营的过程中,运维人员的经验对运维效率起了决定性作用。同时可以看出在生产环境中异构系统的排错异常艰难。
另:如果能熟悉aix core dump 可能会很快定位问题的根本原因。
这篇文章本身可能给不了大家实际帮助,我只是记录下来,供日后工作参考。
有一篇IBM网站上的关于core dump分析的文章,相信会给大家带来帮助。
http://www.ibm.com/developerworks/cn/aix/library/0806_chench_core/index.html