Data Abort: coredll.dll内存泄露!!!

yangyun   2009-12-10 23:00 楼主
我加载程序时候如下
加载模块: Controller.exe
加载模块: commctrl.dll
加载模块: oleaut32.dll
加载模块: ole32.dll
加载模块: coredll.dll
加载模块: aygshell.dll
Platform Type : PLATFORM_TYPE
Data Abort: Thread=835d5000 Proc=82026ca0 'Controller.exe'
AKY=00001001 PC=03f929ec(coredll.dll+0x000229ec) RA=50616548(???+0x50616548) BVA=1a00001b FSR=00000003


Release版本的程序在运行期间,输出窗口不断的出现
Data Abort: Thread=835d5000 Proc=82026ca0 'Controller.exe'
AKY=00001001 PC=03f929ec(coredll.dll+0x000229ec) RA=50616548(???+0x50616548) BVA=1a00001b FSR=00000003


报的coredll.dll,指针在PC=03f929ec处 ,各位怎么解决啊?

回复评论 (19)

友情帮顶下。
点赞  2009-12-11 01:29
追踪代码发现是下面一句引起的,怎么解决啊?
//利用CDialog::Create来创建子对话框,并且使用CTabCtrl::InsertItem来加上相应的标签
        for( int i=0; i < m_nNumOfPages; i++ )
        {
                m_pPages->Create(m_IDD, this);
                InsertItem( i, m_Title );
        }
点赞  2009-12-11 01:40
_AFXWIN_INLINE BOOL CDialog::Create(UINT nIDTemplate, CWnd* pParentWnd)
        { return CDialog::Create(ATL_MAKEINTRESOURCE(nIDTemplate), pParentWnd); }
接收的参数不正确,导致的,怎么解决啊
/*ControllerDlg.cpp中初始化*/
m_sheet.AddPage(_T("界面1"), &m_Workpage1, IDD_DIALOG1);  m_Workpage1为对话框
m_sheet.AddPage(_T("界面2"), &m_Parameter2, IDD_DIALOG2);
m_sheet.AddPage(_T("界面3"), &m_SchoolPhase3, IDD_DIALOG3);
m_sheet.AddPage(_T("界面3"), &m_Warminpage4, IDD_DIALOG4);
m_sheet.Show();

/*TabSheet.cpp*/
BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)
{
        if( MAXPAGE == m_nNumOfPages )
        return FALSE;

        //保存目前总的子对话框数
        m_nNumOfPages++;

        //记录子对话框的指针、资源ID、要在标签上显示的文字
        m_pPages[m_nNumOfPages-1] = pDialog;
        m_IDD[m_nNumOfPages-1] = ID;
        m_Title[m_nNumOfPages-1] = title;

return TRUE;
}
void CTabSheet::Show()
{
        //利用CDialog::Create来创建子对话框,并且使用CTabCtrl::InsertItem来加上相应的标签
        for( int i=0; i < m_nNumOfPages; i++ )
        {
                m_pPages->Create( m_IDD, this );
                InsertItem( i, m_Title );
        }

        //由于对话框显示时默认的是第一个标签被选中,所以应该让第一个子对话框显示,其他子对话框隐藏
        m_pPages[0]->ShowWindow(SW_SHOW);
        for( int i=1; i < m_nNumOfPages; i++)
                m_pPages->ShowWindow(SW_HIDE);
        SetRect();

}
点赞  2009-12-11 02:23
一般情况下,create的东东并使用后,是需要关闭或释放的

或者,只是由于CE的内存回收机制,导致内存出现碎片,LZ可以试试疲劳测试
点赞  2009-12-11 08:20
相同的代码在wince6 中并没有出现这种情况,接收参数也不对,但是他没有报内存泄露,不知道怎么回事了
点赞  2009-12-11 09:57
内存泄露并不是没报就没有泄露的,代码要养成习惯,另外可以借助测试工具
点赞  2009-12-11 10:10
create后没有释放吧?
点赞  2009-12-11 10:26
我也碰到过这种情况,不过,整个工程重新全编一次,就通过了。。。关注
点赞  2009-12-11 18:07
这个确实是不好查呀,看到用mfc搞出来的data abort我是从来没有查出来过原因,一般都换一种方法来实现
最近看论坛上有人出现的data abort是编译环境导致的,
顶了
点赞  2009-12-11 20:22
有的时候是这样的,重新大便宜一遍就好了。原因好像也不好找。如果data abort在驱动或者AP还比较好查,要是在Core就有点麻烦。
点赞  2009-12-12 11:23
data abort一般是内存泄漏

//利用CDialog::Create来创建子对话框,并且使用CTabCtrl::InsertItem来加上相应的标签
for( int i=0; i < m_nNumOfPages; i++ ) //先不要循环了 看看 第一次Create成功不?{
m_pPages->Create(m_IDD, this);
InsertItem( i, m_Title );
}
data abort这种不好查 好好精简一下你的程序 没用的先给删了
点赞  2009-12-12 20:48
引用: 引用 3 楼 wswwxk 的回复:
_AFXWIN_INLINE BOOL CDialog::Create(UINT nIDTemplate, CWnd* pParentWnd)
{ return CDialog::Create(ATL_MAKEINTRESOURCE(nIDTemplate), pParentWnd); }
接收的参数不正确,导致的,怎么解决啊
/*ControllerDlg.cpp中初始化*/
m_sheet.AddPage(_T("界面1"), &m_Workpage1, IDD_DIALOG1);?m_Workpage1为对话框
m_sheet.AddPage(_T("界面2"), &m_Parameter2, IDD_DIALOG2);
m_sheet.AddPage(_T("界面3"), &m_SchoolPhase3, IDD_DIALOG3);
m_sheet.AddPage(_T("界面3"), &m_Warminpage4, IDD_DIALOG4);
m_sheet.Show();

/*TabSheet.cpp*/
BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID)
{
if( MAXPAGE == m_nNumOfPages )
return FALSE;

//保存目前总的子对话框数
m_nNumOfPages++;

//记录子对话框的指针、资源ID、要在标签上显示的文字
m_pPages[m_nNumOfPages-1] = pDialog;
m_IDD[m_nNumOfPages-1] = ID;
m_Title[m_nNumOfPages-1] = title;

return TRUE;
}
void CTabSheet::Show()
{
//利用CDialog::Create来创建子对话框,并且使用CTabCtrl::InsertItem来加上相应的标签
for( int i=0; i < m_nNumOfPages; i++ )
{
m_pPages->Create( m_IDD, this );
InsertItem( i, m_Title );
}

//由于对话框显示时默认的是第一个标签被选中,所以应该让第一个子对话框显示,其他子对话框隐藏
m_pPages[0]->ShowWindow(SW_SHOW);
for( int i=1; i < m_nNumOfPages; i++)
m_pPages->ShowWindow(SW_HIDE);
SetRect();

}


发生异常时的callstack是什么?相关的变量的值是什么?
点赞  2009-12-13 14:54
m_pPages->Create( m_IDD, this );
调用第一次出错,变量值为m_IDD[0]=129,但是到Create函数时候,数据是随机的
函数执行完后输出窗口出现如下代码:

Data Abort: Thread=97d8e000 Proc=8c226cb0 'Controller.exe'
AKY=00002001 PC=03f82ab4(coredll.dll+0x00022ab4) RA=50616548(???+0x50616548) BVA=1c00001b FSR=00000407
点赞  2009-12-14 12:25
引用: 引用 13 楼 wswwxk 的回复:
m_pPages->Create( m_IDD, this );
调用第一次出错,变量值为m_IDD[0]=129,但是到Create函数时候,数据是随机的
函数执行完后输出窗口出现如下代码:

Data Abort: Thread=97d8e000 Proc=8c226cb0 'Controller.exe'
AKY=00002001PC=03f82ab4(coredll.dll+0x00022ab4) RA=50616548(???+0x50616548) BVA=1c00001b FSR=00000407


可以编译debug版本的,连上debugger调试吗?在exception时断下来看看
点赞  2009-12-14 13:22
core.dll肯定不会有问题,问题肯定是自己代码造成的。
慢慢查吧,会有收获的。。。
点赞  2009-12-14 14:02
引用: 引用 14 楼 xdkui 的回复:
引用 13 楼 wswwxk 的回复:
m_pPages->Create( m_IDD, this );
调用第一次出错,变量值为m_IDD[0]=129,但是到Create函数时候,数据是随机的
函数执行完后输出窗口出现如下代码:

Data Abort: Thread=97d8e000 Proc=8c226cb0 'Controller.exe'
AKY=00002001PC=03f82ab4(coredll.dll+0x00022ab4) RA=50616548(???+0x50616548) BVA=1c00001b FSR=00000407


可以编译debug版本的,连上debugger调试吗?在exception时断下来看看

我就是编译的debug版本,断点时看到m_pPages->Create( m_IDD, this );
传递的参数,单步执行到调用函数体,看到接收不正确啊, 要是换一种实现方法,怎么实现呢?
点赞  2009-12-15 11:49
可以断下来,还看不出来出了什么问题?

你可以把异常时的callstack, 相关变量的值,异常时的源码/汇编,所有寄存器的值都贴上来
点赞  2009-12-15 13:48
一直F11到底,在执行 hWnd = ::CreateDialogIndirect(hInst,lpDialogTemplate,pParentWnd->GetSafeHwnd(), AfxDlgProcEx);
后出错,得到的dwError = ::GetLastError();dwError =1400 原因为:无效的窗口句柄。
应该是开始调用的时候参数没有传递出错,怎么改程序啊,大侠们!!!
点赞  2009-12-15 22:21
xdkui,你的邮箱是多少,我把程序发给你帮我看下,帮帮我,谢谢
点赞  2009-12-16 19:33
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复