我试图在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:\test\A.dbg - file not found
DBGHELP: d:\test\dll\A.dbg - path not found
DBGHELP: d:\test\symbols\dll\A.dbg - path not found
DBGHELP: .\A.dbg - file not found
DBGHELP: .\dll\A.dbg - path not found
DBGHELP: .\symbols\dll\A.dbg - path not found
DBGHELP: A.dll missing debug info. Searching for pdb anyway
DBGHELP: wined3dwddm - private symbols & lines
d:\test\A.pdb - unmatched
Unable to add module at 00000000
在最后一行&#34; d:\ test \ A.pdb - 不匹配&#34;虽然它说明了这一点,但我确定pdb文件是构建结果中的那个文件安装的dll也是从中生成的。
其他问题
由于答案表明A.dll可能未加载,因此这是一个可能的反例。为此,我需要稍微修改一下这个问题,以反映我遇到的现实。
我有一组dll(例如,A到Z dlls),它们是从开源项目构建的。说实话,我不了解整个项目的全貌,我想通过追踪函数来了解WinDbg。
此外,当我在流程资源管理器中找到A.dll时,它就在那里。 而且,如果我尝试加载A.dll的符号,我就得到了上述信息。我在这里想念一下吗?
为什么我相信A.dll已加载
我在A.dll中打印了一条诸如(&#34; this_is_uniqe_message_from_A.dll&#34;)之类的消息,我可以看到该消息是连续打印的。
我可以在进程资源管理器中看到A.dll,链接到资源管理器进程。
此外,(我不确定是否重要),我在QEMU 1.7.0版本上使用Windows 8.1。
此问题的原因和解决方案
原因:原因其实非常简单。我想要调试的进程在用户空间中,当我尝试列出已加载的模块时,我处于内核模式。
解决方案:我需要进入用户空间(到我要调试的进程)然后,我可以看到模块列表。另外,我可以设置断点等。
我在MSDN论坛上发布了同样的问题,他们回答了我。参见
答案 0 :(得分:2)
您无法强制WinDbg将DLL加载到进程中,进程必须加载它,然后您可以使用WinDbg查看内存中的DLL。
答案 1 :(得分:2)
您尚未说明您是在进行实时调试还是分析崩溃转储。如果发生故障转储,则可能缺少路径信息(例如,如果使用.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是否会在符号路径中查找DLL。在这一点上,我会说你有两个选择:
.exepath
.reload /f D:\test\A.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 /if <dll> /s <pdbdir> /av /od /pf
检查您是否有公共符号:
Symchk /if <dll> /s <pdbdir> /av /od /ps
下载ChkMatch并执行
ChkMatch -c <dll> <pdb>
答案 2 :(得分:1)
如果这个问题是关于强制windbg将dll加载到进程中,那么即使进程不想加载它,也可以强制windbg将dll加载到进程中
0:000> .load sdbgext ; !loaddll f:\masm32\icztutes\tute17\skeleton.dll ; g
kernel32!LoadLibraryA() will be run when execution is resumed
ModLoad: 10000000 10005000 f:\masm32\icztutes\tute17\skeleton.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:\masm32\icztutes\tute17\skeleton.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.pdb for a.dll
你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
symsrv dll完全能够在构建目录中找到你的dll exes和pdb
building an exe (mydlluser.exe) that depends on a dll (mydll.dll)
必须像这个步行(all defaults nothing except a header inclusion and a single line of code that references the function in header added to default project below)
add the header mydll.h to mydlluser->header files
(如果你正确地来到这里,intellisense应该在开始输入时显示mydll.h)
add code
调用vsstudio fnmydll();
click
f7构建both the exe and dll
load mydlluser.exe in windbg
导航到文件夹xxxxx \ mydlluser \ debug \
并且lll应该在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:\symbols\mydlluser.pdb\2C83FCEAE7EE4AEC822172C75022549E2\mydlluser.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 Settings\Admin\My Documents\Visual Studio 2010\Projects\mydlluser\Debug\mydlluser.pdb
如果您已经关注to a T
,您现在可以开始添加任意数量的dll以及您需要添加到所有这些不同dll的代码。
按照你希望构建它们的顺序构建它,windbg应该能够
在构建目录中找到所有dll / exes /和他们的pdbs
无需设置.sympath .imgpath。无论路径是什么,它都在由visual studio正确复制的默认位置
:\>dir /b *.exe *.dll *.pdb
mydlluser.exe
mydll.dll
mydll.pdb
mydlluser.pdb
vc100.pdb
:\>
答案 3 :(得分:0)
就像snoone
提到的那样,您正在收到该消息,因为您的进程尚未使用您的DLL。也就是说,它不存在于内存中。
您可能想尝试这个
一个。 sxe ld:a.dll
- 这将确保您在内存中加载A.DLL时打破调试器
湾在此之后,您尝试加载符号应该会成功!