混合 mfc 对话框和 mdi 项目的调试构建崩溃
Posted
技术标签:
【中文标题】混合 mfc 对话框和 mdi 项目的调试构建崩溃【英文标题】:Crash in debug build for mixed mfc dialog and mdi project 【发布时间】:2016-02-17 11:26:04 【问题描述】:我正在做一个混合了对话和 MDI 的项目。该项目作为一个选项卡式对话框项目开始。后来MDI被添加到其中。单击其中一个选项卡时,将调用 MDI。如果不单击特定选项卡,它只会保留一个基于对话框的项目。 该项目在发布版本中运行良好。当我进行调试构建时,当我单击初始化 MDI 主框架和窗口的选项卡时出现崩溃。下面给出的是为 MID 窗口创建执行的一段代码。 崩溃消息是 MarkBullV3.exe 中 0x590C0983 (msvcr120d.dll) 处未处理的异常:0xC000041D:在用户回调期间遇到未处理的异常。
任何帮助将不胜感激。如有任何问题,请随时提出。
感谢和问候, 拉克什
pDocTemplate = new CMultiDocTemplate(IDR_Test1TYPE,
RUNTIME_CLASS(CTest1Doc),
RUNTIME_CLASS(CChildFrame), //custom MDI child frame
RUNTIME_CLASS(CTest1View));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
pMainFrame = new CMainFrame;
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME1))
delete pMainFrame;
return FALSE;
m_pMainWnd = pMainFrame;
for (i = 0; i < 16; i++)
theApp.OnFileNew();
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
totCustomPlotCount = 0;
///////////////////下面的堆栈//////////////////// ///////////////
msvcr120d.dll!_CrtDbgBreak() Line 87 C
msvcr120d.dll!_VCrtDbgReportA(int nRptType, void * returnAddress, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 290 C
msvcr120d.dll!_CrtDbgReportV(int nRptType, void * returnAddress, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 262 C
msvcr120d.dll!_CrtDbgReport(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, ...) Line 279 C
mfc120d.dll!AfxAssertFailedLine(const char * lpszFileName, int nLine) Line 24 C++
mfc120d.dll!CScrollView::OnPrepareDC(CDC * pDC, CPrintInfo * pInfo) Line 387 C++
mfc120d.dll!CView::OnPaint() Line 185 C++
mfc120d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2448 C++
mfc120d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2094 C++
mfc120d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 282 C++
mfc120d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 435 C++
mfc120d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 299 C++
user32.dll!744084f3() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]
[External Code]
V3.exe!V10App::InitInstance() Line 291 C++
[External Code]
V3.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Line 26 C++
[External Code]
///////////////////////////////////////////////////////////////////////////////// //////////
【问题讨论】:
如果你有一个调试版本,那么只需在调试器中运行,让调试器捕捉到实际发生的崩溃,这样你就知道它实际发生在哪里。调试器还可以让您检查变量的值,并让您向上走调用堆栈,以便在崩溃发生在系统或库函数中时转到您的代码。 是的,我有一个问题。当您发生崩溃时,您是否打开调试器并查看调用 C 运行时库的调用堆栈?您能否编辑问题中的代码,使其没有多级&
-code 翻译?甚至您的一个报价也从"
变为&amp;quot;
到&amp;quot;
。所以我决定你真的不必那么认真地得到答案。
@Joachim Pileborg 我在调试器中运行过试图检查变量。我没有得到足够的清晰度。我可以看到大多数变量都很好,并且不指向 NULL。让我知道我是否可以在这里分享堆栈内容。有没有办法可以发送附件。
在您的问题下,就在标签下方,有一行带有几个链接。其中一个说“编辑”。请编辑您的问题以包含所有相关信息,包括在发布的代码中指出发生崩溃的位置,并包括所有相关变量的值。
同时编辑代码以删除那些在格式化代码中不需要的 html 实体。
【参考方案1】:
如您所见,您在函数 CScrollView::OnPrepareDC
的第 387 行获得了一个 ASSERT。位于 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\mfc\viewscrl.cpp
正如您在调试输出和源代码中看到的那样:
错误:在绘制滚动视图之前必须调用 SetScrollSizes() 或 SetScaleToFitSize()。
【讨论】:
我不清楚在哪里调用 SetScrollSizes 或 SetScaleToFitSize(),因为我自己没有以任何方式处理滚动视图。我唯一看到的是 CTest1View 类:public CScrollView。您能否在我应该调用上述函数的地方提供更多信息。这有点令人惊讶,因为它在发布模式下运行良好。 不,它在发布模式下不起作用。它也失败了,但它不会引发错误。这是一个很大的区别。您定义在项目中使用 CScrollView。如果是这样,您必须小心初始化视图。而这还没有完成。再次阅读错误消息并阅读 CScrollView 的文档。通常在 OnInitialUpdate 中调用 SetScrollSizes,或者在调用 OnSize 时调用。如果您不想要 CScrollView,请不要使用它;) 感谢 xMRI。你太好了。我可以通过在 updateinit 中设置滚动大小来解决这个问题。虽然后来我删除了它,因为我真的不需要它。你发现问题的速度非常快。谢谢以上是关于混合 mfc 对话框和 mdi 项目的调试构建崩溃的主要内容,如果未能解决你的问题,请参考以下文章