一起空指针引发的程序问题的排查过程

第6837行代码对pReq指针赋值,第6838行代码将pReq对应的结构体中的flowid变量赋给整型变量flowid。

看到这里,我们就怀疑“DlgBuf[dlgindex].para”指针的值有问题。我们又仔细查看了程序代码,发现该指针是在向数据库发消息的函数中被赋值的。其代码如下:

UINT32 SendToDB(…, UINT8 *para, UINT32 paraLen)

{

……

if ((para != NULL)&& (paraLen > 0))

{

memcpy(DlgBuf[iDlgIndex].para, para,(int)paraLen);

}

……

}

整个DlgBuf是在程序刚启动的时候被初始化的。我们又看了调用SendToDB函数的代码行,如下:

SendToDB(…, NULL, 0);

可以看到,传入的para指针的值为空(NULL),paraLen的值为0。根据SendToDB函数的代码流程,DlgBuf[iDlgIndex].para不会被赋值,那么它就会为空(NULL)。

这就是程序问题的原因所在。向数据库发消息的时候,DlgBuf[iDlgIndex].para指针为空(NULL),那么在处理数据库超时的流程中,因为序列号是同一个,则DlgBuf[dlgindex].para指针也为空(NULL),这也导致pReq指针为空。后面要用到该指针对应的结构体中的值,就会找不到,因此程序便崩溃了。

为了验证我们的想法是否正确,我们修改了调用SendToDB函数的代码,不传空指针进去,如下:

T_RetInfoFromReqMsg tRetInfoFromReqMsg = {0};

……

SendToDB(…, &tRetInfoFromReqMsg, sizeof(T_RetInfoFromReqMsg));

对修改后的程序进行测试,就不会出现问题了。

四、总结

通过本次问题排查,我们总结出的经验有以下几个:

(1) 对于指针的使用,一定要小心。对于重要的指针,一定要先检查其是否有准确的值之后再使用,避免使用空指针。

(2) 不管是在哪个函数中,在使用指针之前,一定要先检查该指针是否为空(NULL)。这也算是对程序进行异常保护。

程序问题在所难免,但解决问题的方法也是千变万化。确实,只要我们善于总结,善于分析,那么任何程序问题都是可以解决的。

(本人微博:?topnav=1&wvr=5,,微信号:245924426,欢迎关注!)

谦受益,满招损。

一起空指针引发的程序问题的排查过程

相关文章:

你感兴趣的文章:

标签云: