致命的BUG:NULL指针

来源:互联网 发布:英国标准gpa算法 编辑:程序博客网 时间:2024/04/28 00:21

 致命的BUGNULL指针

最近几天一直在调一个BUG,现象是双窗口下当Video运行到一定时间(5分钟),Open FileDialog运行就出错,程序也不死,就是一直选新的File去播的时候没反应,一直都是这样。

OpenFile函数中打了很多的显示调试信息,始终在怀疑弹出对话框的系统调用函数GetOpenFileDialog函数有问题,但一直只是跟到这里程序就停到这了,不能往下执行了。Debug模式也很难,因为是Video运行到5分钟之后才出错,而且程序也不崩溃。

先排除是我们核心的video处理函数的错误,然后排除AllocLineBuffer的错误,最后无意中留心到hardinit函数,关闭hardinit中的xllpdmainitfreedma函数,程序一直正常的run得很好,也没有出任何错误。考察一天都是这样,所以最后确定是xllpdmainit出错了,仔细看看xllpdmainit函数中有以下的内容:

Xllpdmainit()

{

if(pDMAGlobals == NULL)

{

              // Initialize the DMA Registermap   

      pDMAGlobals = (volatile DMA_GLOBALS *)malloc(sizeof(DMA_GLOBALS));

      if (pDMAGlobals == NULL)

                       returnFALSE;

}

if (pDmacHandle == NULL)

{

     pDmacHandle = (volatileP_XLLP_DMAC_T)VirtualAllocCopy(sizeof(XLLP_DMAC_T),"pDmacHandle",(PVOID)(DMAC_BASE_U_VIRTUAL));

     if (pDmacHandle == NULL)

                return FALSE;

}

if(pDMAGlobals->notFirstTime )

        return TRUE;   

pDMAGlobals->notFirstTime=1;

……

XllpHwInit()

}

freedma()

{

if (pDMAGlobals != NULL)

{

        free(pDMAGlobals);

}

if (pDmacHandle!= NULL)

{

        VirtualFree(pDmacHandle,…);

}

}

起初以为是XllpHwInit硬件初始化出错,结果证明不是这里的错,那只有怀疑pDMAGlobalspDmacHandle了,屏蔽这里,程序正常了,原来就是这里的BUG!!!

仔细想想,在freedma函数中,虽然free(pDMAGlobals)了,但是pDMAGlobals不一定是NULL,然后在Xllpdmainit函数中就不能为pDMAGlobalsmalloc一块内存了,但是下面还是用到了pDMAGlobals指针所代表的内存了,所以程序就碰到了野指针的问题了,操作pDMAGlobals指针,但是并有为pDMAGlobals开辟内存,Video运行时间一长,其所代表的上一次的内存地址内的数据就可能被冲掉了,下次找到这个内存变量时就出错了,导致调用系统API一直不死不活的在那儿打转,程序流程一直下不去。

改正如下:

freedma()

{

if (pDMAGlobals != NULL)

{

        free(pDMAGlobals);

        pDMAGlobals = NULL

}

if (pDmacHandle!= NULL)

{

        VirtualFree(pDmacHandle,…);

        pDmacHandle = NULL

}

}

这样就万无一失了!,看来还是要遵循成对编程原则,释放掉一内存指针之后,必须使其成为NULL

这样的BUG真难找啊。这几天一直在为这个BUG困扰,连睡觉都为这个BUG困扰,没有哪天象这几天这样盼着早点上班去验证自己去BUG的思路,呵呵。

做工程师最开心的就是自己做的东西一点一点出来时候的快感了。

原创粉丝点击