1 现象:问题描述
在xxxx产品版本转测试,出现了一个core文件。
2 关键过程:根本原因分析
使用gdb调试core文件,看到堆栈信息如下:
#0 0x4025de51 in kill () from /lib/i686/libc.so.6
#1 0x4002c9cd in pthread_kill () from /lib/i686/libpthread.so.0
#2 0x4002ce1b in raise () from /lib/i686/libpthread.so.0
#3 0x4025f549 in abort () from /lib/i686/libc.so.6
#4 0x4025843f in __assert_fail () from /lib/i686/libc.so.6
#5 0x5c0fbb6e in XdmsSipSession::getSession(ENIP::Object*, sip::IBaseSession*)
(this=0x5e2809c8, _obj=0x5e280b10, ptrStackSession=0x0)
at SipSession_ser.cpp:325
看出该core是由于使用了一个assert导致的错误。
在代码中对入口参数使用assert:
assert(ptrStackSession);
由于过分信任远端调用的入口参数,实际上远端调用的参数在本地也是体现为本地的桩对象,由于没有考虑到该对象在本地的构造过程中可能会失败,而使用assert,因此造成了这个core。
3 结论:解决方案及效果
把代码修改为:
if (!ptrStackSession)
{
OMLOG(writeDbgLog(elog::Debug, __FILE__, __LINE__,
"Error occured sip adapter's getSession call back, the result session to be NULL.\n")); // 写日志记录错误信息
return;
}
4 经验总结:预防措施和规范建议
对于入口特别是远端调用的入口参数都需要检查它们的合法性,不能使用assert来检查函数的入口参数。
5 备注
6 考核点
对函数的入口参数判断不能使用assert。
7 试题
下面的说法中,哪个是对的(D):
A:入口参数需要判断,但是对于调用的返回值不需要判断。
B:可以用assert来替代对参数的判断。
C:可以使用assert作为某个我们认为不会为空的入口参数值判断。
D:以上说法都不对
阅读(1120) | 评论(0) | 转发(0) |