致命的BUG:NULL指针
来源:互联网 发布:英国标准gpa算法 编辑:程序博客网 时间:2024/04/28 00:21
致命的BUG:NULL指针
最近几天一直在调一个BUG,现象是双窗口下当Video运行到一定时间(5分钟),Open FileDialog运行就出错,程序也不死,就是一直选新的File去播的时候没反应,一直都是这样。
在OpenFile函数中打了很多的显示调试信息,始终在怀疑弹出对话框的系统调用函数GetOpenFileDialog函数有问题,但一直只是跟到这里程序就停到这了,不能往下执行了。Debug模式也很难,因为是Video运行到5分钟之后才出错,而且程序也不崩溃。
先排除是我们核心的video处理函数的错误,然后排除AllocLineBuffer的错误,最后无意中留心到hardinit函数,关闭hardinit中的xllpdmainit和freedma函数,程序一直正常的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硬件初始化出错,结果证明不是这里的错,那只有怀疑pDMAGlobals和pDmacHandle了,屏蔽这里,程序正常了,原来就是这里的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的思路,呵呵。
做工程师最开心的就是自己做的东西一点一点出来时候的快感了。
- 致命的BUG:NULL指针
- 3大致命bug
- null 指针的处理
- Android Studio 2.2.1关于InstantRun的致命Bug
- 智能指针的一个bug
- 【C++】指针引发的bug
- 【C++】指针(2):NULL指针、指针的算术运算
- NULL指针
- NULL指针
- NULL指针
- null指针
- NULL指针
- NULL指针
- NULL指针
- 三星手机严重的bug,后台不断刷log,所以非常致命,很费电
- avro 1.7.7中存在致命的bug, 可以使用1.7.4版本
- EXE+DLL框架一个致命BUG处理
- 令人惊讶的NULL类指针
- 分页代码
- Effective C++ 笔记
- 远程代码注入新技术详解
- LOG4J
- 跟随屏幕滚动的层
- 致命的BUG:NULL指针
- 学习笔记
- Spring-JdbcTemplament
- 第三回:第一个D3D程序
- 我的牛人之路!
- 黑客高手技术的7大秘籍
- 自己没有解决的怪问题
- c语言数据结构及算法篇
- 深入认识JavaScript中的this指针