Chinaunix首页 | 论坛 | 博客
  • 博客访问: 542895
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:51:39

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:以上说法都不对
阅读(1033) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~