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

时间:2013-12-26 14:45:54

标签: c++ windows winapi dll rundll32

我正在编写一个本地dll,它将与rundll32.exe一起运行(这是我们客户的义务)。我使用VS的调试属性来定义:

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

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

此设置调用我的函数,但不会加载任何符号,因此不会触发任何断点。我已经了解到,只有在MessageBox的入口处打电​​话后,才会调用我的函数。

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

什么可能导致这种行为?

2 个答案:

答案 0 :(得分:2)

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

Fwiw,你的命令参数设置不是犹太教。它应该是"$(TargetPath)" ENTRY_POINT。双引号以避免路径名中的空格出现问题,无需逗号。

答案 1 :(得分:1)

简而言之:由于在32Bit环境中调试64Bit dll,所有问题都出现了。

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

  1. 调试程序在其据称已启动的进程中不存在。
  2. 手动附加时,未加载符号。
  3. 当击中“Break All”过程时,apeared将成为deadloack。
  4. 原因是,当调试器为32Bit时,dll为64Bitrundll32.exe作为64Bit版本进行干扰的路径。这通常会导致WOW64启动32Bit版本的子流程 - 因此不同的流程因此调试器不存在。

    谢谢大家。