WinDbg 表示在映像列表中找不到".dll"
WinDbg says ".dll" was not found in the image list
我试图在WinDbg中加载一个dll,但出现了此错误。细节如下。
-
使用VisualC++express构建A.dll。
-
将A.pdb和A.dll放在d:\test\目录中。
-
将图像路径和符号路径设置为d:\test
.sympath gives OK D:test
-
尝试使用以下命令加载
.reload /f A.dll
它给出
"A.dll" was not found in the image list. Debugger will attempt to load "A.dll" at given base 00000000. Please provide the full image name, including the extension (i.e. kernel32.dll) for more reliable results.Base address and size overrides can be given as .reload <image.ext>=<base>,<size>. DBGENG: wined3dwddm.dll - Partial symbol image load missing image info DBGHELP: No header for wined3dwddm.dll. Searching for dbg file DBGHELP: d:testA.dbg - file not found DBGHELP: d:testdllA.dbg - path not found DBGHELP: d:testsymbolsdllA.dbg - path not found DBGHELP: .A.dbg - file not found DBGHELP: .dllA.dbg - path not found DBGHELP: .symbolsdllA.dbg - path not found DBGHELP: A.dll missing debug info. Searching for pdb anyway DBGHELP: wined3dwddm - private symbols & lines d:testA.pdb - unmatched Unable to add module at 00000000
在最后一行"d:\test\A.pdb-不匹配"中,尽管它这样说,但我确信pdb文件是来自构建结果的文件,安装的dll也是从该文件生成的。
附加问题
由于答案表明A.dll可能未加载,因此这里有一个可能的反例。为此,我需要稍微修改一下这个问题,以反映我遇到的现实。
我有一组dll(比如说,从A到Z的dll),它们是从开源项目构建的。老实说,我不了解整个项目的全貌,我想通过跟踪函数来了解WinDbg。
此外,当我在进程资源管理器中找到A.dll时,它就在那里。而且,如果我尝试加载A.dll的符号,我会收到上面的消息。这里有我想念的东西吗?
为什么我认为加载了A.dll
-
我在a.dll中打印了一条uniqe消息,例如("this_is_uniqe_message_from_a.dll"),我可以看到该消息正在连续打印。
-
我可以在进程资源管理器中看到A.dll,链接到资源管理器进程。
此外,(我不确定这是否重要),我在QEMU 1.7.0版本上使用Windows 8.1。
此问题的原因和解决方案
原因:原因其实很简单。我想调试的进程在用户空间中,当我尝试列出加载的模块时,我处于内核模式。
解决方案:我需要进入用户空间(到我想要调试的进程),然后,我可以看到模块列表。此外,我可以设置断点等
我在MSDN论坛上发布了同样的问题,他们回答了我
http://social.msdn.microsoft.com/Forums/vstudio/en-US/263a3d84-8256-4f03-a70e-47d482a24cfb/windbg-lm-command-does-not-show-all-loaded-modules?forum=windbg#263a3d84-8256-4f03-a70e-47d482a24cfb
路径信息不完整
您还没有描述您是在进行实时调试还是在分析崩溃转储。在崩溃转储的情况下,路径信息可能会丢失(例如,如果使用.dump /marR
创建转储)。如果是这种情况,则需要指定可执行路径。
在步骤3中,您说您已经将图像路径和符号路径设置为D:\test。但是,命令的输出看起来不像典型的.sympath
输出。它应该是这样的:
0:022> .sympath d:test
Symbol search path is: d:test
Expanded Symbol search path is: d:test
接下来,您说您也指定了图像路径,但没有显示.exepath
:的输出
0:022> .exepath d:test
Executable image search path is: d:test
Expanded Executable image search path is: d:test
如果你没有指定图像路径,我不确定WinDbg是否会在Symbol路径中查找DLL。在这一点上,我想说你有两个选择:
- 如前所述设置
.exepath
- 指定要加载的DLL的全名:
.reload /f D:testA.dll
意外的模块名称
一个问题可能是WinDbg使用的模块名称与DLL名称不匹配。该名称例如可以是image01000
或类似的名称。如果名称不像A.dll
那样简单,并且包含特殊字符,则可能会替换这些字符,例如Notepad++:
0:007> lm m note*
start end module name
00400000 005f5000 notepad__ (deferred)
要查看DLL名称,请使用lmf
:
0:007> lmf m note*
start end module name
00400000 005f5000 notepad__ C:Program Files (x86)Notepad++notepad++.exe
不匹配的符号
如果你不信任WinDbg关于匹配或不匹配的符号,你也可以在WinDbg之外验证PDB文件是否与DLL匹配。
使用Symchk(调试工具)进行检查
要检查您是否有私人符号:
Symchk /if <dll> /s <pdbdir> /av /od /pf
要检查您是否有公共符号:
Symchk /if <dll> /s <pdbdir> /av /od /ps
使用ChkMatch检查
下载ChkMatch并执行
ChkMatch -c <dll> <pdb>
您不能强迫WinDbg将DLL加载到进程中,进程必须加载它,然后您可以使用WinDbg查看内存中的DLL。
如果这个问题是关于强制windbg将dll加载到进程中的,是的,即使进程不想加载dll,也可以强制windgg将其加载到进程
0:000> .load sdbgext ; !loaddll f:masm32icztutestute17skeleton.dll ; g
kernel32!LoadLibraryA() will be run when execution is resumed
ModLoad: 10000000 10005000 f:masm32icztutestute17skeleton.dll
kernel32!LoadLibraryA() returned 10000000
(7a8.aac): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=0030020e ecx=7c91ead5 edx=0034fd7d esi=7c801d7b edi=7c81cb12
eip=7c90120e esp=0034ff9c ebp=0034fff0 iopl=0 nv up ei pl nz ac pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000216
ntdll!DbgBreakPoint:
7c90120e cc int 3
0:001> lmDvm sk*
Browse full module list
start end module name
10000000 10005000 skeleton (deferred)
Image path: f:masm32icztutestute17skeleton.dll
Image name: skeleton.dll
Browse all global symbols functions data
Timestamp: Wed Sep 14 11:13:41 2005 (4327B88D)
CheckSum: 00000000
ImageSize: 00005000
Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4
编辑地址注释
原件。reload output says missing symbol info
尽管你说你有a.dll的.pdb
您do not provide the real name and a real output and one may not be able to infer
你的问题是from your descriptions
无论你多么专业let the tools speak for themselves
他们说一种更好的通用语言。
除非绝对必要r efrain from moving dlls and pdbs around
symsrvdll完全能够在构建目录中找到您的dlls-exes和pdb
building an exe (mydlluser.exe) that depends on a dll (mydll.dll)
在visual studio 2010 express中
必须类似于此漫游(all defaults nothing except a header inclusion and a single line of code that references the function in header added to default project below)
- 开始->程序->msvcvs2010e->msvcvs2010e
- 新项目->win32XXXXX(使用中的控制台示例->mydlluser->ok->finish
- 新项目->win32XXXXX(再次使用控制台)->mydll->添加到解决方案->好
- 不要单击"完成"更改应用程序设置以生成dll
- ->应用程序设置->dll&导出符号->完成
- 将include和lib路径设置为项目属性
- 项目->属性->配置属性->vc++目录->include->选择mydll文件夹的路径
- 设置项目依赖项
- 项目->项目依赖项->mydll
- 确认依赖项中的生成顺序(默认情况下将生成mydll第一个和依赖于mydll的mydlluser将在mydll之后生成
只要确保它是这样设置的
add the header mydll.h to mydlluser->header files
(如果你正确到达这里,intellisense应该在你开始打字时显示mydll.h)
调用vsstudio fnmydll()提供的默认伪函数的add code
;
click
f7构建both the exe and dll
导航到文件夹xxxxx\mydlluser\debug\的load mydlluser.exe in windbg
并且dll应该在lm列表中自动可用
0:000> lm m my*
start end module name
00400000 0041b000 mydlluser (deferred)
10000000 1001b000 mydll (deferred)
.reload应正确找到dll和pdb
查找pdbcopy or binplace
以将dll正确存储在symsrv目录结构中可由_NT_SYMBOL_PATH环境变量引用
:000> .reload /f my*
SYMSRV: f:symbolsmydlluser.pdb2C83FCEAE7EE4AEC822172C75022549E2mydlluser.pdb not found
SYMSRV: http://msdl.microsoft.com/download/symbols/mydlluser.pdb/2C83FCEAE7EE4AEC822172C75022549E2/mydlluser.pdb not found
*** WARNING: Unable to verify checksum for mydlluser.exe
DBGHELP: mydlluser - private symbols & lines
C:Documents and SettingsAdminMy DocumentsVisual Studio 2010ProjectsmydlluserDebugmydlluser.pdb
如果您已经遵循了to a T
,那么现在可以开始添加任意数量的dll,以及需要添加到所有这些不同dll中的任何代码,并且
按照你想要的任何顺序构建它们,windbg应该能够
在构建目录中查找所有dll/exes/和thier-pdb
无需设置.sympath.imgpath.whateverpath所有这些都在其默认位置,由visual studio 正确复制
:>dir /b *.exe *.dll *.pdb
mydlluser.exe
mydll.dll
mydll.pdb
mydlluser.pdb
vc100.pdb
:>
就像snoone
提到的那样,由于您的DLL还没有被您的进程使用,您正在收到该消息。也就是说,它不存在于内存中。
你可能想试试这个
a。sxe ld:a.dll
——这将确保在内存中加载A.DLL时中断调试器
b。在此之后,您加载符号的尝试应该会成功!
- 加载"D:UsersPublicDocumentsopencvbuildx64vc14binopencv_world340d.dll",找不到或打开PDB文件
- CMake 生成的 MSVC 项目找不到符号,即使为其相关 dll 正确生成了 lib 文件也是如此
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 找不到 sdl2.dll
- Qt应用程序找不到第三方DLL并崩溃
- 链接器找不到导入的 DLL 的 LIB 文件
- 从Windows 10编译VS2017在Windows 7和…上部署..找不到DLL
- 提升 Python 找不到 dll 文件
- CMAKE链接在Windows上共享库(LIB),但找不到DLL
- Windows找不到DLL在路径中的目录中以为其
- 找不到 DLL 入口点
- Maven NAR插件:在路径上找不到DLL依赖项
- 使用Visual Studio 11 RC调试时找不到DLL依赖项
- 执行程序时找不到 DLL (c++)
- 错误 LNK2019:未解析的外部符号链接器找不到 DLL
- WinDbg 表示在映像列表中找不到".dll"
- c# / c++在相同的解决方案- DllImport找不到DLL
- exe路径中找不到DLL
- Azure WebJob 找不到 DLL
- 为什么当我只使用静态.lib时,Windows会告诉我找不到.dll文件