C++ 如何使用WinDbg分析VC+的崩溃转储+;应用

C++ 如何使用WinDbg分析VC+的崩溃转储+;应用,c++,visual-c++,windbg,crash-dumps,C++,Visual C++,Windbg,Crash Dumps,如何分析转储文件?这是一个非常广泛的问题 第一步是将转储文件加载到WinDbg实例中 接下来,您需要确保您有一个符号设置 最后,您可以运行命令!analyze-v以获取对其执行的基本分析。您需要为代码提供符号信息,以使转储文件有价值 该网站为我提供了大量信息。我也很喜欢马里奥·赫瓦特和丹尼尔·普拉瓦特写的这本书。苔丝·费兰德斯必须从Windbg开始。我强烈推荐它们。以下是一些常规步骤,可以帮助您顺利完成任务: 首先,您必须更改编译器的设置,以便它创建PDB文件,即使是发布版本。编译器的后期版本默

如何分析转储文件?

这是一个非常广泛的问题

  • 第一步是将转储文件加载到WinDbg实例中
  • 接下来,您需要确保您有一个符号设置
  • 最后,您可以运行命令
    !analyze-v
    以获取对其执行的基本分析。您需要为代码提供符号信息,以使转储文件有价值

  • 该网站为我提供了大量信息。我也很喜欢马里奥·赫瓦特和丹尼尔·普拉瓦特写的这本书。

    苔丝·费兰德斯必须从Windbg开始。我强烈推荐它们。

    以下是一些常规步骤,可以帮助您顺利完成任务:

    首先,您必须更改编译器的设置,以便它创建PDB文件,即使是发布版本。编译器的后期版本默认是这样做的,但是在VisualC++的许多版本中,您必须自己完成。创建程序数据库文件,然后在应用程序的每个构建过程中保留这些文件的存档。至关重要的是,应用程序的每个构建都有自己的PDB集。例如,您不能重复使用在Build10中创建的相同转储来检查Build15生成的转储。在项目的整个生命周期中,您将得到大量的PDB,因此请为此做好准备

    接下来,您需要能够识别生成转储文件的应用程序的确切版本。如果您正在创建自己的迷你转储文件(例如,通过调用),最简单的方法可能是将迷你转储文件名的一部分作为应用程序的完整版本号。您需要有一个合理的版本编号方案,以使其正常工作。在我的商店里,每次autobuilder创建构建时,我们都会将所有分支的构建编号增加一

    现在您已经从客户处收到了转储文件,您知道了创建转储的应用程序的确切版本,并且找到了此版本的PDB文件

    现在,您需要查看源代码管理的历史记录,并找到该软件的确切版本的源代码。做到这一点的最佳方法是在每次生成时将“标签”应用于分支。将标签的值设置为精确的版本号,这样就很容易在历史记录中找到它

    您几乎可以启动WinDbg/Visual C++:

  • 获取该版本应用程序的完整源代码树。将其放在硬盘上的另一个位置,比如说
    c:\app\u build\u 1.0.100
    1.0 build\100版应用程序
  • 获取应用程序的确切版本的二进制文件,并将它们放在硬盘上的某个位置。简单地安装应用程序的该版本以获取二进制文件可能是最简单的
  • 将PDB文件放在与步骤2中的二进制文件相同的位置
  • 现在,您有两个查看转储文件的选项。您可以使用或WinDbg。使用VisualStudio更容易,但WinDbg功能更强大。大多数情况下,VisualStudio中的功能就足够了

    要使用VisualStudio,只需像打开项目一样打开转储文件。打开后,“运行”转储文件(默认情况下为F5),如果所有路径都设置正确,它将直接指向崩溃的代码,并为您提供一个调用堆栈,等等

    要使用WinDbg,您必须跳过几个环:

  • 启动WinDbg
  • 打开转储文件。(默认情况下,Ctrl+D)
  • 告诉WinDbg获取正确的MicroSoft符号文件。键入
    .symfix
    。这可能需要一些时间,因为它将从互联网上下载大量内容
  • 告诉WinDbg符号(PDB文件)的位置。键入
    .sympath+c:\pdblocation
    ,将PDB文件替换为路径名。请确保在
    .sympath
    +
    符号之间没有空格,否则会破坏步骤3
  • 告诉WinDbg源代码在哪里。键入
    .srcpath c:\app\u build\u 1.0.100
    将从源代码管理获取代码的路径替换为此版本的软件
  • 告诉WinDbg分析转储文件。键入
    !分析-v
  • 几分钟后,如果一切配置正确,WinDbg将带您直接找到崩溃的位置。此时,您有一百万个选项可以深入挖掘应用程序的内存空间、关键部分的状态、窗口等,但这远远超出了本文的范围

    祝你好运

    (请参阅下面的“转储”部分)

    使用WinDbg的基本教程和演示
    “启动”/“连接WinDBG”的不同方式
    工作区 了解工作区如何工作

    Cmdtree “cmdtree”允许您定义调试器命令的“菜单”,以便轻松访问常用命令,而无需记住简洁的命令名

    您不必将所有命令定义放在同一个cmdtree文本文件中……您可以将它们分开,并根据需要加载多个命令定义(然后它们会有自己的窗口)

    启动脚本 您可以使用命令行上的-c选项在启动WinDBG时自动运行WinDBG脚本

    提供打开DML(调试器标记语言)模式、加载特定扩展、设置.NET异常断点、设置内核标志(例如,在内核调试时,您可能需要更改DbgPrint掩码以便查看跟踪信息…ed nt!Kd_DEFAULT_mask 0xffffff)、加载cmdtrees等的机会

    示例脚本:

    $$ Include a directory to search for extensions
    $$ (point to a source controlled or UNC common directory so that all developers get access)
    .extpath+"c:\svn\DevTools\WinDBG\Extensions"
    $$ When debugging a driver written with the Windows Driver Framework/KMDF
    $$ load this extension that comes from the WinDDK.
    !load C:\WinDDK\7600.16385.1\bin\x86\wdfkd.dll
    !wdftmffile C:\WinDDK\7600.16385.1\tools\tracing\i386\wdf01009.tmf
    $$ load some extensions
    .load msec.dll
    .load byakugan.dll
    .load odbgext.dll
    .load sosex
    .load psscor4
    $$ Make commands that support DML (Debugger Markup Language) use it
    .prefer_dml 1
    .dml_start
    $$ Show NTSTATUS codes in hex by default
    .enable_long_status 1
    $$ Set default extension
    .setdll psscor4
    $$ Show all loaded extensions
    .chain /D
    $$ Load some command trees
    .cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree1.txt
    .cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree2.txt
    $$ Show some help for the extensions
    !wdfkd.help
    !psscor4.help
    .help /D
    
    命令备忘单
    扩展 “扩展”允许您扩展