使用 WinDbg 调试故障转储时图像路径的作用是什么?

What is the role of the image path when debugging a crash dump with WinDbg?

直到现在我总是将图像路径作为符号路径的一部分,所以我有这样的东西:

Symbol search path is: srv*e:\Symbols*http://msdl.microsoft.com/download/symbols;e:\tmp\BackgroundJobEngine

但是正确的做法是什么?

  1. 我是否应该像今天一样将图像路径作为符号路径的一部分?
  2. 我应该把它作为图像路径传递吗?
  3. 两者都有?

.sympath

如果你的符号路径是

srv*e:\Symbols*http://msdl.microsoft.com/download/symbols;e:\tmp\BackgroundJobEngine

表示

  1. WinDbg 将在 e:\Symbols 中搜索符号。如果找到,请从那里使用它。
  2. 如果未找到,它将在 Microsoft 符号服务器上查找,如果可用则下载符号,将其存储在 e:\Symbols 中并从那里使用。
  3. 如果没有找到,它将在 e:\tmp\BackgroundJobEngine 中查找。如果找到,请从那里使用它。

你的情况到底发生了什么还不清楚,因为我们不知道你是如何存储符号的。如果将它们添加到 e:\Symbols,例如在 post 构建步骤中使用 symstore add,您的可执行文件的符号将从 e:\Symbols 中使用,而 e:\tmp\BackgroundJobEngine 是无用的。

如果您不使用 symstore 并且您的符号实际上位于 e:\tmp\BackgroundJobEngine,则从该位置使用符号。

如果符号信息在可执行文件中(exe 可能包含 PDB 的完整路径),WinDbg 也会尝试从那里加载它。如果可执行文件不是在您的机器上构建的,则可能会由于不同的路径而失败,因此添加像 e:\tmp\BackgroundJobEngine 这样的路径是有意义的。

.exepath

还有一种情况,minidump 文件不包含可执行文件本身以最小化大小,因此 WinDbg 有一个艰巨的任务反汇编等

我自己从来没有遇到过这种情况(主要是因为我经常使用 .NET,无论如何它都需要完整的内存),但是 Dmitry Vostokov "Memory Dump Analysis Anthology Collector's Edition" 一书中给出了一个例子:

1:kd> ub bfabc399
                ^ Unable to find valid previous instruction for 'ub bfabc399'

1:kd> uf driver!ProcessObject
No code found, aborting

可以通过.exepath命令设置可执行路径来解决。然后 WinDbg 将从该位置加载程序集本身(不一定是符号)。