使用MAP文件VS2010 MFC

Iss*_*mTP 2 c++ mfc visual-studio-2010 map-files

我已经开发了一个客户,他在进行某项操作时会遇到这个问题.这不会发生在同一个地方和相同的数据上,而且,它不会发生,也不会发生在我的本地开发机器上,也不会发生在我的测试虚拟机(没有所有开发设备)中.

鉴于这些条件,我决定使用MAP进行编译(在配置属性 - >链接器 - >调试器中启用选项/ MAP)以查看哪个函数导致崩溃.

如果我已经正确理解,当程序崩溃时我要检查偏移错误然后在我的MAP中搜索RVA + BASE列:

     Address                         Publics by Value                                      Rva+Base       Lib:Object
 0001:00037af0       ?PersonalizzaPlancia@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00438af0 f   DlgGestioneDatiProgetto.obj
 0001:00038000       ?SalvaTemporanei@CDlgGestioneDatiProgetto@MosaicoDialogs@@IAEXXZ 00439000 f   DlgGestioneDatiProgetto.obj
Run Code Online (Sandbox Code Playgroud)

实际上,我的崩溃发生在偏移:

00038C90
Run Code Online (Sandbox Code Playgroud) 所以我认为它在方法中的某个地方:

MosaicoDialogs::CDlgGestioneDatiProgetto::PersonalizzaPlancia
Run Code Online (Sandbox Code Playgroud)

但这并非绝对可能,所以假设计算机不能出错,我就是那个做得不好的人.

有人能解释我如何以正确的方式阅读MAP吗?

gbj*_*anb 5

不要打扰 - 相反,在启用符号的情况下构建项目并将其剥离到pdb文件中.

稍微修改程序,在使用未处理的异常处理程序崩溃时编写一个minidump

将新编译的程序提供给客户,并在崩溃时调用MiniDumpWriteDump.

请客户将此.dmp文件发送给您,然后您只需将其加载到Visual Studio(或WinDbg)中,它就会将符号与程序匹配,并且还会匹配代码.您应该能够看到确切的代码行和所涉及的一些变量.(如果使用VS,当你加载.dmp文件时,右上角将是"开始调试"的选项,点击它,因为它将在崩溃时"开始调试")

首先在本地尝试 - 在程序中的某处放置一个div by zero错误,看看是否可以在运行后调试转储.请注意,您必须为程序的每个版本保留完全相同的符号文件 - 它们完全匹配.即使没有任何更改,您也不能指望一个构建的符号文件与另一个构建匹配.

有这样的教程,比如CodeProject中的这个教程,看起来它描述了你需要的东西.