基于MFC的CPP程序断言失败

问题描述 投票:0回答:1

我写了一个基于MFC的CPP程序,release版本在目标机上运行顺利,debug版本则不行。断言似乎失败,如下截图所示:

assert message when running debug version on target machine while release version ok

我需要此调试版本在目标计算机上运行,因此我可以通过从我的开发计算机附加到它来远程调试它。

我使用新版本的dependency walker(https://github.com/lucasg/Dependency),但它给出的结果与发布版本相同(没有红色警报),即使发布版本可以运行,调试版本不能。依赖遍历器显示以下内容:(第二个屏幕截图)

dependency walker result for the  debug version

因为在我安装了 Visual Studio 2022 (mfc 143) 的开发机器中,调试版本和发布版本都运行正常。

当我将其部署到目标机器时,发布版本运行正常,但调试版本失败。即使我安装了vc_redist.x64.exe(从我的开发机器复制),并处理了相关的mfc140d.dll,msvcp140d.dll,vcruntime140d.dll和vcruntime140_1d.dll。实际上,我将所有以下文件复制到目标机器的同一目标目录下:

the files copied to the target machine under same directory

有人可以告诉我出了什么问题吗?我不知道从哪里调试它。

非常感谢。

c++ debugging mfc assert target-platform
1个回答
0
投票

我认为 Dependency Walker 对于您的需求来说不是很有用。断言对话框意味着程序已成功启动,但遇到意外状态。

我机器上的afxwin2.inl第795行是这样的:

_AFXWIN_INLINE int CComboBox::AddString(LPCTSTR lpszString)
    { ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM)lpszString); }

基本上,有一个断言窗口上的控件(组合框)仍然有效。也许某些代码在窗口关闭后仍在尝试执行某些操作。

所有这些都是解决方案。

  • 在目标计算机上安装 Visual Studio。直接在其上构建和调试。

  • 安装远程调试工具。这是在无法本地重现的情况下进行调试的标准方法。将其与远程桌面相结合,以便您可以单击远程计算机上的对话框并在本地计算机上进行调试。

  • 更手动的解决方案是将所有 PDB 文件复制到与其相应的 EXE 或 DLL 相同的目录中(例如,将 foo.pdb 放在与 foo.exe 相同的目录中,但将 bar.pdb 放在与 bar 相同的目录中) .dll 等...)。然后使用诸如 WinDbg 之类的工具,可以将其复制到目标计算机。然后调试。还要设置您的源路径。

© www.soinside.com 2019 - 2024. All rights reserved.