我已经开发了一个顾客在做一定的操作时经历的课程。这不是在同一个地方和同一数据上发生,而且,它不会发生,也没有在我的本地开发机器中也没有在我的测试虚拟机中(无线的所有开发设备)。

鉴于这些条件,我决定用映射编译(在配置属性 - >链接器 - >调试器中为option / 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
. 实际上,我的崩溃发生在偏移量:

00038C90
,所以我应该认为它在方法中的某个地方:

MosaicoDialogs::CDlgGestioneDatiProgetto::PersonalizzaPlancia
.

但这不是绝对可能的,所以假设电脑不能错,我是那个做错的人。

有人可以解释我如何以正确的方式阅读地图?

有帮助吗?

解决方案

读取映射文件以查找崩溃位置在此代码项目文章中解释了崩溃位置。

http://www.codeproject。COM /文章/ 3472 /查找 - 崩溃 - 信息 - 使用-Map-file

希望有帮助。

其他提示

不要打扰 - 相反,使用符号构建项目并将其绑住pdb文件。

在使用未处理的异常处理程序

将新编译的程序提供给客户,并且当它崩溃呼叫minidumpwritedump时。

要求客户将此.dmp文件发送给您,然后您只需在Visual Studio(或WindBG)中即可加载它,它将将符号与程序匹配,并且也将匹配代码。您应该能够看到确切的代码线和一些涉及的变量。 (如果使用vs,当您加载.dmp文件时,右上角将是“开始调试”的选项,因为它将在崩溃点'开始调试')

首先在本地 - 将div放入程序中的某个位置,看看是否可以在运行后调试转储。请注意,您必须为每个程序的构建保留完全相同的符号文件 - 它们完全匹配。您无法期望一个构建符号文件以匹配另一个构建,即使没有任何改变。

这类事物有教程,如这个来自codeproject ,看起来它描述了所需的。

对于PostMortem调试,还有一个替代方案将 not 需要使用地图文件。相反,它需要您创建一个简单的注册表脚本来启用一些 wer (Windows错误报告)标志来捕获崩溃转储文件。首先,使用调试符号构建您的应用程序。然后,请按照收集的说明用户模式转储。基本上,您在“LocalDumps”键下创建一个子密钥。此子密钥必须是应用程序的名称,例如“MyApplication.exe”。然后,创建“DumpCount”,“Dumptype”和“DumpFolder”键/值。用户是否运行注册表脚本。这将能够在本地捕获转储。然后,让用户迫使崩溃收集转储文件。然后,用户可以将转储文件发送给您使用前面创建的符号进行调试。最后,您需要创建一个注册表脚本,该脚本删除添加到注册表中添加的键/值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top