最近写了一大段代码,抽象得厉害,容易绕进去,因为写单测的代价很大(借口),所以很多问题到联调的是否才发现。

而且花费了很大的经历才查出来,主要问题有如下几个问题

1. 变量未初始化

具体来说,就是指针之类的,这个是之前遇到的比较多,当前已经很少了,拿出来说是因为这次用上了一个栈上单例(常见的单例,一般是new一个对象)的实现。

因为对其用法理解不深,导致为初始化对象。

2. 绑定端口失败

绑定端口失败后,主线程退出了,然后在启动的线程就core掉了。从core文件分析以为是线程有什么问题,但后来不断地删除代码,最终定位是port绑定失败,换一个端口就好了。

如果早点去看日志,就不必绕这么大的弯了!!

3. 自动完成

写代码时,用到了vim的自动完成功能,导致函数一直返回-1, 示例代码如下

int Class::init(int output, int input)
{
// arg check
if (output_)
{
return -1;
}
.....
}

这种情况下,编译器完全没有错误提示,只能靠自己小心了。。

4.继承类调用基类同名函数

基本的实例代码如下

class Base {
public:
int init(int output, int input);
};
class Class : public Base {
int init(int output, int input);
}; int Class::init(int output, int input)
{
// arg check
if (output_)
{
return -1;
} // return Base::init(output, input)
return init(output, intput);
}

继承类同名参数列表调用基类参数列表,本来只是想调用基类的init函数,但由于override了,所以还是会继续调用Class::init(),最终会因为递归栈深度core掉。

此时需要显示的指定调用的为基类函数.

5. protobuf 通信问题

protobuf

写的程序是server-client模式,cs间通信协议是用protobuf定义的。client 将protobuf封装好,通过tcp发送给server后,server端报解析失败。

这个错误以前也遇到过,问题的根源是,项目中protobuf并不是以同一个模块存在的,而是client和server中均有一个独立的模块。双方需要对协议。

后来查找出的问题是server端protobuf 添加了一个required字段,没有通知client端,导致解析错误

同样这个问题,如果早点看日志的话,调试时间会少很多。因为我们一般在专门的log中查找,并没有去标准输入和输出的日志中去查找错误。而protobuf

解析错误具体的日志信息是放在了标准输入输出中。

6. 分号问题

其实是一个很傻的问题,在将语句改写为if条件时引入的,具体代码如下

get_return_int(zzz);
->
if (get_return_int(zzz)<);
{
printf("negtive something\n");
return -;
}
return 0

在if后多了个;导致总是返回-1

7. 溢出

相关代码如下。

int64_t get_file_size(const char* filename)

int file_size = get_file_size("data/westfly")
if (file_size < )
{
printf ("load errro\n");
return -;
}
return ;

加载一份文件,之前小于2G,用int可以保存大小。某一天大于2g了,int就小于0了,导致说加载出错。

8. opt版本core,debug版本不core

现象debug版本中,运行得很好,打开-O2选项,进行opt发布版,运行就core掉了。

根据core文件, info thread

发现线程只有50多个,正常预期应该是150左右。明显某些线程没启动起来。

于是怀疑是主线程粗暴的退出了,导致其它线程访问出错。

添加相关日志,确认了失败的具体位置,经过定位,发现是某个基类函数最后

没有返回值。但外层经过了判断,导致主线程退出了。

9. 单线程不core,多线程core

拷贝之前的代码,没有多想,之前的代码中是支持多线程的,但线上居然只配置了一个(坑啊!!)

然后,我这个需求需要其多个来处理,导致core掉。

找了很久,一个个线程的看状态,发现某个资源的mutex被其它线程持有(core文件找问题也需要看机缘啊),

于是分析得到可能是共享变量的问题。

最终定位到从某个全局的资源池获取资源的时候,没有加锁。添加锁后完美解决。

10. protobuf 返回值误用

static bool ParseFromString(const string & input, Message * output);

if(ParseFromString() < 0)

{

}

默认为返回值为int类型,导致出错返回false时,也显示成功。

11. 状态机问题

12. 默认参数

程序中用到一个hashmap,插入时value的接口为

insert(key, value, flag=0)

关键是最后一个默认参数,表示当key存在时的处理,

当flag = 0 时,如果key存在,则忽略

当flag=1时,如果key存在,则覆盖。

在程序调用时,直接insert了,采取默认参数0.

而程序reload接口与load 共同调用一个函数。

导致reload时,新value不生效。

13. shell转码问题

为了加密系统,使用了base64编解码,用的是私有的码表,生成了url,通过curl 请求时反解url时,总是缺一些信息,

几次定位才发现url中包含$符号,shell在curl时,将$后的字符转义为变量了,导致为空,将双引号改成单引号就好了。

14. 程序边界问题

某天,接到报警,线上的server down掉了,经过定位,发现是返回值未加判断的问题。

其实,还是接上面一个场景,我以为经过base64加密后,应该就高枕无忧了,在base64反解码的时候,就没有判断是否解码成功,结果

对于某些请求base64反解码的返回值为负值,导致往string中assign时,core掉了。

应该是我们编的url太过显眼,然后被人想方法破解,结果程序就core掉了。还是考虑不周全啊。

最近的bug列表总结(C++)的更多相关文章

  1. 本周MySQL官方verified/open的bug列表(11月15日至11月21日)

    本周MySQL verified的bug列表(11月15日至11月21日) 1. Bug #70923    Replication failure on multi-statement INSERT ...

  2. 本周MySQL官方verified/open的bug列表(11月8日至11月14日)

    本周MySQL verified的bug列表(11月8日至11月14日) 1. Bug #70859-DWITH_EXAMPLE_STORAGE_ENGINE=1 is ignored     URL ...

  3. 本周MySQL官方verified的bug列表(11月1日至11月7日)

    本周MySQL verified的bug列表(11月1日至11月7日) 1.Bug #70839JSON_VALID allows to have two elements with the same ...

  4. 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我

    写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ...

  5. oracle已知会导致错误结果的bug列表(Bug Issues Known to cause Wrong Results)

    LAST UPDATE:     1 Dec 15, 2016 APPLIES TO:     1 2 3 4 Oracle Database - Enterprise Edition - Versi ...

  6. Bug列表

    1.Space is not allowed after parameter prefix ': 这个问题主要原因是Hibernate不能识别SQL语句中的":="导致的网上有其他 ...

  7. ie6,ie7,ie8 css bug兼容解决方法

    IE浏览器以不支持大量的css 属性出名,同时也因其支持的css属性中存在大量bug. 这里收集了好多的bug以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决,也希 ...

  8. ie6,ie7,ie8 css bug兼容解决记录

    ie6,ie7,ie8 css bug兼容解决记录 转载自:ie6,ie7,ie8 css bug兼容解决记录 - 前端开发 断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面 ...

  9. CSDN中的Bug

    简述 在用CSDN的过程中,发现了许许多多的Bug.之前没有做记录,直接反馈给客服了,有时没图说得不太清楚,现在不都追求有图有真相么O(∩_∩)O~,所以在此记录一下. 作为程序员的一份子,Bug对我 ...

随机推荐

  1. 【POJ】3134 Power Calculus

    1. 题目描述给定一个正整数$n$,求经过多少次乘法或除法运算可以从$x$得到$x^n$?中间结果也是可以复用的. 2. 基本思路实际结果其实非常小,肯定不会超过20.因此,可以采用IDA*算法.注意 ...

  2. CY7C68013A的一点总结

    一. 值得参考的资料:FX2 TechRefManual.USB应用开发宝典. LabVIEW-USB通信简单教程(用于参考生成labview驱动程序).USB设备请求和描述符整理(仅用于理解描述符的 ...

  3. Building Xcode iOS projects and creating *.ipa file from the command line

    For our development process of iOS applications, we are using Jenkins set up on the Mac Mini Server, ...

  4. LeetCode Maximum Product Subarray 最大子序列积

    题意:给一个size大于0的序列,求最大的连续子序列之积.(有正数,负数,0) 思路:正确分析这三种数.0把不同的可能为答案的子序列给隔开了,所以其实可以以0为分隔线将他们拆成多个序列来进行求积,这样 ...

  5. windows 下使用 MinGW + msys 编译 ffmpeg

    本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处.    FFmpeg是在Linux平台下开发的,但 ...

  6. 【转】Github轻松上手1-Git的工作原理与设置

    转自:http://blog.sina.com.cn/s/blog_4b55f6860100zzgp.html 作为一个程序猿,如果没有接触过stack overflow和Github,就如同在江湖中 ...

  7. css的框架——base.css

    一.常用的base.css文件(也是比较简略的,但按需增加) body,ul,li,ol,dl,dd,h1,h2,h3,h4,h5,h6,input,p{ margin:;} ul,ol { padd ...

  8. [转] ArcEngine 产生专题图

    小生原文 ArcEngine 产生专题图 ArcEngine提供多个着色对象用于产生专题图,可以使用标准着色方案,也可以自定义着色方案,ArcEngine提供8中标准着色方案. 一.SimpleRen ...

  9. MyBatis一对多双向关联——MyBatis学习笔记之七

    处理has-one关系需要用到association元素,而处理has many关系则需要用到collection元素.例如本例中,假设一 名教师可同时指导多名学生,下面就来介绍如何使用collect ...

  10. CXF之六 自定义拦截器

    CXF已经内置了一些拦截器,这些拦截器大部分默认添加到拦截器链中,有些拦截器也可以手动添加,如手动添加CXF提供的日志拦截器.也可以自定义拦截器,CXF中实现自定义拦截器很简单,只要继承Abstrac ...