最近2个Bug的总结

9 篇文章 0 订阅

昨天调试业务时,出现了2个bug,后面解决之后,想想也是自己不细心造成的,在此总结和分析下这2个bug。

1 封装的msgq操作在读出消息时,会发生程序core。

2 封装的msgq操作写入消息时,写入的数据不完整。


导致第一个问题的代码如下:

size_t size = msgrcv(m_msgId, (void*)&s_data, MAX_LENGTH, type, IPC_NOWAIT);
if(size < 0)
{
     m_errmsg = strerror(errno);
     return -2;
}
strOut.assign(s_data.msg, size);
当时程序未打开core,开始没想到程序core了,后面打开core,有core文件产生,通过gdb调试,发现core发生在strOut.assign()这个位置,当时看到size是个很大的值,此时想到了size可能是负数被转成了正数,导致size变大,发生了core,同时也想到了当msgq消息为空时,msgrcv会返回-1,这时已经知道了问题在哪里了,原来变量size的类型不对,后来通过man确认了下,系统的msgrcv的返回值为ssize_t,size_t前面多个s,粗心啊,后面size的类型修改为ssize_t,问题解决。

备注:size_t在32位机器是unsigned int,在64位机器为unsigned long

            ssize_t在32位机器是signed int,在64位机器为signed long


导致第二个问题的代码如下:

struct _msg_struct_ s_data;
s_data.type = type;
strncpy(s_data.msg, str.c_str(), str.length());
这个问题是其他同事发现的,我们传输的数据是二进制协议的,也就是说数据中会存在\0,也就是字节值为0的数据,而strcpy和strncpy都是根据\0来定位数据的,\0之后的数据都不会被复制,此时用memcpy/memmove都是可以的,这2个操作都是按内存拷贝数据的,不会出现上述问题。

备注:strcpy,strncpy不支持二进制协议。

            memcpy,memmove支持二进制协议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值