debugging 基于MFC的C++程序Assert失败

jhdbpxl9  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(116)

我写了一个基于MFC的C++程序,虽然发布版本在目标机器上运行顺利,但调试版本不能。它出现Assert失败,如以下截图所示:

我需要这个调试版本在目标机器上运行,这样我就可以通过从我的开发机器附加到它来远程调试它。
我使用了新版本的依赖步行者(https://github.com/lucasg/Dependencies),但它给出了与发行版相同的结果(没有红色警报),即使发行版可以运行,调试版不能。依赖步行者显示如下:(第二个截图)

因为在我安装了Visual Studio 2022(MFC 143)的开发机器上,它在调试版本和发布版本中都运行得很好。
而当我将其部署到目标机器时,发布版本运行正常,但调试版本失败。即使我安装了vc_redist.x64.exe(从我的开发机器复制),并复制了相关的mfc140d.dll,msvcp140d.dll,vcruntime140d.dll和vcruntime140_1d.dll。实际上,我将所有文件复制到同一目标目录下的目标机器:

谁能告诉我哪里出了问题?我不知道从哪里调试。
非常感谢.

y3bcpkx1

y3bcpkx11#

我不认为Dependency步行者对你需要的东西很有用。Assert对话框暗示程序成功启动,但是遇到了一个意外的状态。因此,你已经满足了所有的运行时依赖关系。
我的机器上的afxwin2.inl的第795行是这样的:

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

基本上,有一个Assert,窗口上的控件(组合框)仍然有效。也许有些代码在窗口关闭后仍然试图做一些事情。
所有这些都是解决方案。

  • 在目标计算机上安装Visual Studio。直接在目标计算机上生成和调试。
  • 安装远程调试工具。这是在本地无法复制的情况下进行调试的标准方法。将其与远程桌面结合使用,这样您就可以在远程计算机上单击对话框并在本地计算机上进行调试。
  • 一个更手动的解决方案是将所有PDB文件复制到与其对应的EXE或DLL相同的目录中(例如将foo.pdb放在与foo.exe相同的目录中,但将bar.pdb放在与bar.dll相同的目录中,等等.)。然后使用一个工具,如WinDbg,它可以被xcopy'd到目标机器。然后调试。

相关问题