MFC程序,点击对话框的右上角的关闭按钮(x按钮)时,有时会触发断点,有时不会处罚断点

时间:2022-07-10 23:51:14
求教[大神,MFC程序,点击对话框的右上角的关闭按钮(x按钮)时,有时会触发断点,有时不会处罚断点,这是什么原因啊,程序能够正常运行,功能也能狗全部实现,就是点击右上角的关闭按钮,有时会出现那种情况,有时不会出现,会不会是内存 泄漏导致的啊。

10 个解决方案

#1


有没有高手知道啊?不点击关闭按钮时,一切是正常的,功能都能实现,点击关闭按钮后,有时出现触发断点,有时不触发断点

#2


基本上内存泄漏,或者一些关闭前的操作非法

#3


  2楼:我这个有内存泄漏,内存泄漏会导致那样的情况出现吗?

#4


先解决内存泄漏问题,看看还会不会异常

#5


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处, 看不懂时双击下一行,直到能看懂为止

#6


利用 F5 调试方式让程序跑起来,然后 观察 调试,堆栈窗口。往下看, 看看是在你的哪个函数范围内。

#7


引用 4 楼 shiyanzi 的回复:
先解决内存泄漏问题,看看还会不会异常


这是调试时,错误定位的函数:
LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
// special message which identifies the window as using AfxWndProc
if (nMsg == WM_QUERYAFXWNDPROC)
return 1;

// all other messages route through message map
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd==NULL || pWnd->m_hWnd == hWnd);
if (pWnd == NULL || pWnd->m_hWnd != hWnd)
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}

#8


引用 6 楼 void_main_void 的回复:
利用 F5 调试方式让程序跑起来,然后 观察 调试,堆栈窗口。往下看, 看看是在你的哪个函数范围内。



LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
// special message which identifies the window as using AfxWndProc
if (nMsg == WM_QUERYAFXWNDPROC)
return 1;

// all other messages route through message map
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd==NULL || pWnd->m_hWnd == hWnd);
if (pWnd == NULL || pWnd->m_hWnd != hWnd)
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}
红色就是错误定位时的地方,调用堆栈里面都是看不懂的函数,自己写的程序里都没有,唯一一个还定位与MFC自动生成的一个地方


CGWSQDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
//  “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
//  “取消”来关闭对话框的代码
}

求助啊,编程菜鸟啊

#9


引用 7 楼 longbo19910424 的回复:
Quote: 引用 4 楼 shiyanzi 的回复:

先解决内存泄漏问题,看看还会不会异常


这是调试时,错误定位的函数:
LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
// special message which identifies the window as using AfxWndProc
if (nMsg == WM_QUERYAFXWNDPROC)
return 1;
// all other messages route through message map
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd==NULL || pWnd->m_hWnd == hWnd);
if (pWnd == NULL || pWnd->m_hWnd != hWnd)
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}


红色的即为错误定位时的地方。

一般情况下是,一天没运行那个MFC程序以后,就容易关闭对话框按钮后,出现断点,但是过一段时间就好了

#10


检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!

搜“GDI泄露检测”

#1


有没有高手知道啊?不点击关闭按钮时,一切是正常的,功能都能实现,点击关闭按钮后,有时出现触发断点,有时不触发断点

#2


基本上内存泄漏,或者一些关闭前的操作非法

#3


  2楼:我这个有内存泄漏,内存泄漏会导致那样的情况出现吗?

#4


先解决内存泄漏问题,看看还会不会异常

#5


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处, 看不懂时双击下一行,直到能看懂为止

#6


利用 F5 调试方式让程序跑起来,然后 观察 调试,堆栈窗口。往下看, 看看是在你的哪个函数范围内。

#7


引用 4 楼 shiyanzi 的回复:
先解决内存泄漏问题,看看还会不会异常


这是调试时,错误定位的函数:
LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
// special message which identifies the window as using AfxWndProc
if (nMsg == WM_QUERYAFXWNDPROC)
return 1;

// all other messages route through message map
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd==NULL || pWnd->m_hWnd == hWnd);
if (pWnd == NULL || pWnd->m_hWnd != hWnd)
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}

#8


引用 6 楼 void_main_void 的回复:
利用 F5 调试方式让程序跑起来,然后 观察 调试,堆栈窗口。往下看, 看看是在你的哪个函数范围内。



LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
// special message which identifies the window as using AfxWndProc
if (nMsg == WM_QUERYAFXWNDPROC)
return 1;

// all other messages route through message map
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd==NULL || pWnd->m_hWnd == hWnd);
if (pWnd == NULL || pWnd->m_hWnd != hWnd)
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}
红色就是错误定位时的地方,调用堆栈里面都是看不懂的函数,自己写的程序里都没有,唯一一个还定位与MFC自动生成的一个地方


CGWSQDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
//  “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
//  “取消”来关闭对话框的代码
}

求助啊,编程菜鸟啊

#9


引用 7 楼 longbo19910424 的回复:
Quote: 引用 4 楼 shiyanzi 的回复:

先解决内存泄漏问题,看看还会不会异常


这是调试时,错误定位的函数:
LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
// special message which identifies the window as using AfxWndProc
if (nMsg == WM_QUERYAFXWNDPROC)
return 1;
// all other messages route through message map
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(pWnd==NULL || pWnd->m_hWnd == hWnd);
if (pWnd == NULL || pWnd->m_hWnd != hWnd)
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
return AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
}


红色的即为错误定位时的地方。

一般情况下是,一天没运行那个MFC程序以后,就容易关闭对话框按钮后,出现断点,但是过一段时间就好了

#10


检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!

搜“GDI泄露检测”