我使用以下code将DLL从内存加载到另一个正在运行的可执行文件中。使用常用方法调试以下模块将无法工作,因为调试器无法找到相应的PDB文件,更不用说让它知道DLL实际上已加载到进程中。我设法通过以下方式设置它与windbg:
.reload [DLLLocationInMemory]=0x10000000,[DllSizeInMemory]a48194
.sympath SRV*C:\Symbols\MS\*http://msdl.microsoft.com/download/symbols;c:\mySpecialSymbolsDir
这样做每次调试迭代都非常烦人,我想知道是否可以使用visual studio的调试窗口(特别是步骤#1)完成类似的事情。
答案 0 :(得分:1)
您可以运行.imgscan /l
查找内存中的所有模块,并事实上.reload
。
(这个元命令基本上是在所有页面对齐的地址上搜索“MZ”。对于它找到的每个“MZ”,它会尝试将从该地址开始的数据解释为DOS_IMAGE_HEADERS
结构,获取结构的e_lfanew
字段,转到它指向的位置,并假设那里有一个PE头(NT_IMAGE_HEADER
)。然后它转到SizeOfImage
的{{1}}字段PE标头的一部分。然后它调用IMAGE_OPTIONAL_HEADER
。我不确定你是否会为加载模块加载一个有意义的名称。)
您的符号路径应该是工作空间的一部分,或者在环境变量.reload ModName=AddressOfFoundMZ,SizeOfImage
中设置(或者像Thomas建议的那样使用WinDbg的命令行参数)。无论您是正常加载还是顺利加载DLL,无论您是使用Visual Studio还是WinDbg,都是如此。
我非常怀疑在Visual Studio中是可行的。我知道在Visual Studio中的模块Windows中没有这样的选项,并且鉴于Visual Studio by design does not allow loading mismatched symbols我没有看到它允许你声明“好,你看到这个内存区域 - 假设那里是一个DLL .. 。“;这正是WinDbg的用途。
答案 1 :(得分:0)
虽然您的标题是" Visual Studio",但在您的问题和评论中,您提到如果流程可以自动化,WinDbg解决方案也会有所帮助。所以这是WinDbg的答案。
WinDbg知道工作空间的概念。在你阅读并练习Uncovering how Workspaces work with WinDbg [MSDN blogs]之前,你不会得到它。了解它们的工作原理后,设置基础工作区以包含您喜欢的符号路径。
如果您对工作区感到满意,请为WinDbg创建一个包含-Q
的链接:抑制恼人的"保存工作区?"问题
作为替代方法,您可以使用-y <SymbolPath>
命令行开关传递符号路径。
或者,如果命令太长,请使用更短更全面的表单
.sympath c:\mySpecialSymbolsDir
.symfix+ C:\Symbols\MS\
要在WinDbg的开头运行命令,请使用-c "<command>"
。这应该是例如适合.reload
。如果要运行许多命令或复杂命令(尤其是涉及引号时),请查看Run script file [MSDN]。
根据您是否正在进行实时调试或崩溃转储分析,您可能希望使用更多WinDbg command line options [MSDN]。
在您的情况下可能有用的事情:
-pn <name>: Debug a process by name
-<executable>: Start the executable instead of attaching.
-z <dump>: Debug a dump file
-srcpath <path>: Path to your sources