使用 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
但是正确的做法是什么?
- 我是否应该像今天一样将图像路径作为符号路径的一部分?
- 我应该把它作为图像路径传递吗?
- 两者都有?
.sympath
如果你的符号路径是
srv*e:\Symbols*http://msdl.microsoft.com/download/symbols;e:\tmp\BackgroundJobEngine
表示
- WinDbg 将在
e:\Symbols
中搜索符号。如果找到,请从那里使用它。
- 如果未找到,它将在 Microsoft 符号服务器上查找,如果可用则下载符号,将其存储在 e:\Symbols 中并从那里使用。
- 如果没有找到,它将在 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 将从该位置加载程序集本身(不一定是符号)。
直到现在我总是将图像路径作为符号路径的一部分,所以我有这样的东西:
Symbol search path is: srv*e:\Symbols*http://msdl.microsoft.com/download/symbols;e:\tmp\BackgroundJobEngine
但是正确的做法是什么?
- 我是否应该像今天一样将图像路径作为符号路径的一部分?
- 我应该把它作为图像路径传递吗?
- 两者都有?
.sympath
如果你的符号路径是
srv*e:\Symbols*http://msdl.microsoft.com/download/symbols;e:\tmp\BackgroundJobEngine
表示
- WinDbg 将在
e:\Symbols
中搜索符号。如果找到,请从那里使用它。 - 如果未找到,它将在 Microsoft 符号服务器上查找,如果可用则下载符号,将其存储在 e:\Symbols 中并从那里使用。
- 如果没有找到,它将在 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 将从该位置加载程序集本身(不一定是符号)。