繁体   English   中英

使用rundll32.exe调试本机dll失败,无法加载符号

[英]Debugging a native dll using rundll32.exe , fail to load symbols

我正在编写一个本机dll,该dll将与rundll32.exe (我们的客户端必须使用)一起运行。 我已经使用VS的调试属性来定义:

Command: c:\windows\system32\rundll32.exe
Command Argument: $(TargetPath) , ENTRY_POINT

其中ENTRY_POINT是我的dll的导出函数,该函数遵循rundll32.exe接口。

此设置调用我的函数,但不会加载任何符号,因此不会触发任何断点。 我了解到,仅在调用MessageBox的入口之后才调用我的函数。

当我使用自己的容器应用程序(只是一个调用LoadlibraryGetProcAddressENTRY_POINT函数本身的exe Loadlibrary )时,所有断点都会触发,并且可以像往常一样进行逐步调试。

什么会导致该行为?

MessageBox()为您提供了足够的资源来解决此问题。 当显示时,使用Debug + Break All进入调试器。 接下来,使用Debug + Windows + Modules,在列表中找到DLL。 右键单击它,然后选择“符号负载信息”。 您将获得调试器在其中搜索PDB文件的所有目录的列表。 确保其中之一存在它。

首先,您的“命令参数”设置不符合要求。 它应该是"$(TargetPath)" ENTRY_POINT 双引号可以避免在路径名中使用空格,不要使用逗号。

简而言之:所有问题都源于在64Bit环境中调试32Bit dll。

从原始问题和注释中提到的附带问题可以看出,我在这里遇到的问题很少:

  1. 据称已启动的进程中没有调试器。
  2. 手动附加时,不会加载符号。
  3. 当点击“ Break All”时,进程将被视为死守。

原因是提到dll是32Bit而调试器是64Bit rundll32.exe的路径被rundll32.exe64Bit版本。 通常,这会导致WOW64启动32Bit版本的子进程-从而导致进程不同,因此调试器不存在。

谢谢大家

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM