国产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,利用日志解决。