【问题标题】:Windbg and Symbol FilesWindbg 和符号文件
【发布时间】:2013-08-15 19:52:03
【问题描述】:

我对符号文件有疑问。我试验了一下符号文件路径,设置路径如下:

srv*c:\symbols*http://msdl.microsoft.com/download/symbols;C:\Users\myuser\Desktop\driver2\objchk_win7_x86\i386

但后来我改成下面这样:

srv*c:\symbols*http://msdl.microsoft.com/download/symbols;C:\Users\myuser\Desktop\mydriver\objchk_win7_x86\i386

我在路径中用 mydriver 更改了 driver2:这是我的驱动程序的 .pdb 文件所在的路径。问题是 .sympath 打印出正确的路径,如下所示:

kd> .sympath
Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols;C:\Users\myuser\Desktop\mydriver\objchk_win7_x86\i386
Expanded Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols;c:\users\myuser\desktop\mydriver\objchk_win7_x86\i386

但是仍然找不到驱动程序的符号。如果我运行 .reload 命令,我们可以看到 WinDbg 在 driver2/ 目录而不是 mydriver/ 目录中寻找 .pdb。

kd> .reload /f mydriver.sys
SYMSRV:  c:\symbols\mydriver.pdb\3D655E533B0449A38D7AB0AF637CE9201\mydriver.pdb not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/mydriver.pdb/3D655E533B0449A38D7AB0AF637CE9201/mydriver.pdb not found
SYMSRV:  c:\users\myuser\desktop\mydriver\objchk_win7_x86\i386\mydriver.pdb\3D655E533B0449A38D7AB0AF637CE9201\mydriver.pdb not found
DBGHELP: c:\users\myuser\desktop\driver2\objchk_win7_x86\i386\mydriver.pdb - file not found
*** ERROR: Module load completed but symbols could not be loaded for mydriver.sys
DBGHELP: mydriver - no symbols loaded

我已删除所有工作区,关闭 WinDbg,重新启动 Windows,但 driver2/ 条目仍然存在:它必须在默认工作区的缓存中或某处。如何删除 WinDbg 的整个个人设置,包括那些缓存,以便我可以重新启动 WinDbg 并使用 driver2/ 路径并使其使用 mydriver/。

我也可以通过将 mydriver/ 目录重命名为 driver2/ 来解决问题,但我不想这样解决问题。我想了解发生了什么并尽我所能解决它。

【问题讨论】:

    标签: windows windbg windows-kernel


    【解决方案1】:
    !sym noisy
    

    会告诉你为什么它不想加载 pdb。也许您确实重建了驱动程序并且 pdb guid 或 pdb 年龄不再匹配。 如果你确定你已经构建了相同的源文件,你可以通过

    强制加载你的 pdb
    .reload /i /f yourdriver.sys
    

    /i 是加载不匹配 pdb 的神奇开关。此开关不会从您的符号服务器加载任何驱动程序,但它只会考虑本地文件路径来加载您的驱动程序。也不考虑符号存储目录 (SRV*),因为会有很多版本可供选择。但是,如果您的 .sympath 直接指向您的 pdb,它将被加载。

    【讨论】:

    • /i 为我工作,就我而言,我在带有 SP1 的 Windows 7 上使用 windbg 6.2.8299.0 AMD64 版本来调试完整转储文件。我非常确定 .sympath 是正确的,并且我使用 symchk 来验证 .dll 和 .pdb 是否完美匹配。但是windbg仍然拒绝加载pdb。顺便说一句,从 windbg 帮助中,即使您没有指定 /f 标志,/i 也暗示 /f。
    【解决方案2】:

    驱动程序最初是在 driver2 路径中编译和构建的吗? mydriver.sys 的位置是什么?

    For example assume I have symbol path 'c:\users\rahulsundar\desktop' set and try to load ntdll.dll, then it displays below error,
    
    0:000> .reload ntdll.dll
    DBGHELP: c:\users\rahulsundar\desktop\ntdll.pdb - file not found
    DBGHELP: c:\users\rahulsundar\desktop\dll\ntdll.pdb - file not found
    DBGHELP: c:\users\rahulsundar\desktop\symbols\dll\ntdll.pdb - file not found
    DBGHELP: C:\Windows\SYSTEM32\ntdll.pdb - file not found
    DBGHELP: ntdll.pdb - file not found
    *** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll - 
    DBGHELP: ntdll - export symbols
    
    Note: Windbg by default searches ntdll.pdb from the same location 'C:\Windows\SYSTEM32'
    

    解决当前问题的一种方法,从日志中可以清楚地看出,windbg 需要目录 'c:\users\myuser\desktop\mydriver\objchk_win7_x86\i386\mydriver.pdb\3D655E533B0449A38D7AB0AF637CE9201\mydriver.pdb' 中的 pdb 文件。

    所以手动创建目录直到 'mydriver.pdb\3D655E533B0449A38D7AB0AF637CE9201' 并放置 pdb 文件 在那里。

    这只是 Windows 期望二进制符号的标准方式(binaryfoldername\hashid\pdbfile)。

    【讨论】:

    • 嗨,是的,我可以解决这样的问题。我也可以通过将 mydriver 重命名为 driver2 目录来解决它。我首先在driver2目录下编译了驱动,然后将目录重命名为mydriver,删除除mydriver.c之外的所有文件并重新编译。我停止了驱动程序,将其删除并重新启动调试的Windows系统;我还重新启动了被调试系统。我认为,问题在于WinDbg将此路径保存在缓存中的某个位置,我很感兴趣;一旦调试器连接到 Windbg,默认工作区视图也会更改,因此工作区必须保存在某个地方,尽管我删除了它。
    • 似乎对于驱动程序文件的路径正在累积。不确定它是windbg中的真正错误还是文档错误。如果您怀疑它是 Windbg 中的错误,您可以尝试安装最新版本的 windbg 以查看它是否修复了问题。您也可以尝试删除适当的默认工作区(用户\内核\远程等)并通过文件->将WS另存为->在适当的模式下默认保存您想要的工作区(用户\内核\远程)
    【解决方案3】:

    解决此问题的更好方法 - 打开 sim 噪声并查看路径 在 .reload /f my_driver.sys 或向 .sympath[+] path/to/pdb 添加新路径并执行相同操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 2015-02-18
      • 2011-11-06
      • 2012-02-21
      • 1970-01-01
      • 2010-10-03
      • 2015-09-07
      相关资源
      最近更新 更多