国产bmc项目bug调试总结

2018-01-02  本文已影响55人  qianlihu

1、代码逻辑不清晰,if嵌套过多。
2、代码逻辑不清晰,逻辑代码书写较为分散

  rc = sqlite3_open(DB_NAME, &db); //逻辑分散
      if (rc) {
          fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
          sqlite3_close(db);
          return cJSON_CreateObject();
      }   
  
      cJSON * p;
      p = cJSON_GetObjectItem(params, "action");
      if (p == NULL)
          return cJSON_CreateObject(); //存在资源泄漏问题
      else
          PowerPolicy = p->valueint;//逻辑不清晰导致if过多
      string sql = "";

建议写法:

cJSON * p = cJSON_GetObjectItem(params, "action");
if(p == NULL)
  return cJSON_CreateObject();
int powerpolicy = p->valueint;  
int rc= sqlite3_open(DB_NAME, &db); //逻辑分散
      if (rc) {
          fprintf(stderr, "Can't open database");
          return cJSON_CreateObject();
      }   
...

3、调试日志不规范。
建议:
调试时候 打印时间戳,线程号,当前文件和行号,调试信息,可如下设计API
c实现

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#include <pthread.h>



void _debug(const char *filename,int line,const char *fmt,...)
{
        char buf[1024];

        va_list ap; 
        va_start(ap,fmt);
        vsnprintf(p,size,fmt,ap);
        va_end(ap);

        time_t t = time(NULL);
        printf("%u-%s:%d-%p %s\n",t,filename,line,pthread_self(),buf);
}

.h头文件

#define debug(fmt,...)    _debug(__FILE__,__LINE__,fmt,__VA_ARGS__)      

4、API接口设计不合理,没有遵循谁申请,谁释放原则。

cJSON* send_request(char const *ip,uint16_t port,char const *method,int id, cJSON* params)

1、不应该在send_request中释放参数申请的内存。
2、返回参数最好传入指针。(副作用,不释放)

5、代码中没有处理好定时和异步任务。
 1、能不用信号的地方,就不要用信号。
  2、框架上有定时器,必要的时候可以增加API

6、调试技巧
1 查看资源占用情况
1. top
2 lsof
3 进入/proc/pid/  查看线程数量。
 有异常处理异常。

gdb 抓到信息发现比较难分析的话,就放弃gdb,利用日志解决。

上一篇下一篇

猜你喜欢

热点阅读