Post

Windbg 使用经验总结

Windbg 使用指南

介绍

  • Windbg 是什么 Windbg 是一款在 Windows 下非常强大的调试工具,主要用于分析和调试应用程序和操作系统的问题。它提供了丰富的功能和命令,可以帮助开发人员诊断和解决各种软件错误和故障

基本概念

调试器和调试目标

调试器是一种工具或软件,用于帮助开发人员分析和解决应用程序或操作系统中的问题。它提供了一系列功能和命令,用于检查程序的执行状态、查看变量的值、跟踪代码的执行流程等。调试器可以帮助开发人员定位和修复错误,提高代码质量和性能。 调试目标是指需要被调试的应用程序或操作系统。当我们使用调试器时,我们将调试器连接到调试目标上,以便能够观察和控制目标程序的执行过程。调试目标可以是一个正在运行的应用程序,也可以是一个崩溃的程序或操作系统。 通过调试器,开发人员可以在调试目标中设置断点,观察变量的值,单步执行代码,查看函数调用栈等,以便分析程序的行为和定位问题。调试器和调试目标之间的交互使得开发人员能够深入了解程序的内部运行情况,并找到潜在的错误和故障。 在Windbg中,调试器是Windbg本身,而调试目标可以是应用程序、操作系统或内核模式驱动程序等。通过Windbg,开发人员可以连接到调试目标,并使用Windbg提供的命令和功能进行调试和分析。

Dump 文件

当应用程序或操作系统发生崩溃或异常时,会生成一个称为 “Dump” 文件的转储文件。Dump 文件是一种二进制文件,它包含了在崩溃发生时内存中的数据和状态信息。它可以被用于分析和调试崩溃的原因。 Dump 文件的作用是提供一个快照,记录了崩溃时程序的内存状态、寄存器值、堆栈信息等。这些信息对于开发人员来说非常有价值,因为它们可以帮助开发人员重现崩溃的场景,并定位问题的根本原因。

生成 Dump 文件的情况通常包括
  • 应用程序崩溃:当应用程序发生未处理的异常或错误时,操作系统会生成一个 Dump 文件,以便开发人员进行后续的调试和分析。
  • 应用程序卡死时:主动在任务管理器中,选择 “创建内存转储文件”
  • 操作系统崩溃:当操作系统发生严重错误或异常时,例如蓝屏错误(BSOD),操作系统会生成一个 Dump 文件,以便进行故障排除和问题分析。
Dump 文件位置

一般情况下,PC 环境下 Dump 文件的默认生成目录是:

  • C:\Windows\System32\config\systemprofile\AppData\Local
  • C:\Users\user\AppData\Local\CrashDumps

符号文件和调试符号

符号文件包含了程序中各种符号的信息,如函数名、变量名、类型信息等。它们与编译器生成的可执行文件或库文件一起使用,以便在调试器中能够正确地显示和解释这些符号。符号文件通常具有扩展名为 “.pdb”(Program Database)。

调试符号是指在调试过程中使用的符号信息。它们可以是编译器生成的符号文件,也可以是其他调试工具生成的符号文件。调试符号包含了程序的调试信息,如源代码行号、变量的地址和值等。调试符号的作用是帮助调试器在调试过程中定位和解释代码中的符号信息。

可以通过在编译配置中允许调试信息,在编译程序时,会生成与应用程序同名的符号文件

基础使用方法

根据 Dump 文件,分析崩溃问题

一般在生产环境下,我们可以通过程序崩溃时产生的 Dump 文件进行崩溃问题的分析和定位。

配置符号文件路径和源码路径

在开始调试崩溃问题时,需要提前配置号对应的符号文件和源码路径,这样就可以看到详细的出错信息。同时可以直接跳转到源码位置,方便调试和解决问题。

  • 配置应用程序本身的符号文件路径
  • 配置 Microsoft的符号文件地址:SRV*http://msdl.microsoft.com/download/symbols

setup windbg symbols path

调试 Dump 文件常用命令

  • !analyze -v 直接运行 !analyze -v 指令,windbg 会自动进行异常分析,它会检查程序的堆栈、寄存器状态、异常信息等,并生成一个详细的分析报告。这个报告包含了引发崩溃的代码行、异常类型、异常消息等信息。它可以帮助我们进行定位和解决问题。 error details

  • ~*kp 这里的 ~ 指线程信息,* 指所有线程, k 指打印堆栈, p 代表显示堆栈跟踪中调用的每个函数的所有参数, 所以 ~*kp 会打印所有线程的堆栈信息,并显示参数情况 stack trace

还可以通过指定具体的线程序号,查看指定线程的堆栈信息,例如 ~3kp。同时还可以根据前面设置的源码路径直接跳转到出错的源码位置。 detail stack trace

调试进程

如果是在研发环境或者有条件直接调试机器时,我们可以直接使用 windbg 调试进程。 launch process

直接通过 Attach to process 可以开始调试运行中的程序 launch process

其他常用命令

  • g: 继续执行程序,直到下一个断点或程序结束。
  • bp: 设置断点,可以是地址断点、函数断点或条件断点。
  • bl: 列出当前设置的断点。
  • lm: 列出当前加载的模块。
  • !thread: 显示线程的详细信息。
  • !process: 显示进程的详细信息。
  • !address: 显示指定地址的详细信息。
  • !locks: 打印被持有的线程锁的信息

参考资料

This post is licensed under CC BY 4.0 by the author.