我正在编写一个本地dll,它将与rundll32.exe
一起运行(这是我们客户的义务)。我使用VS
的调试属性来定义:
Command: c:\windows\system32\rundll32.exe
Command Argument: $(TargetPath) , ENTRY_POINT
其中ENTRY_POINT
是我的dll的导出函数,它遵循rundll32.exe
接口。
此设置调用我的函数,但不会加载任何符号,因此不会触发任何断点。我已经了解到,只有在MessageBox
的入口处打电话后,才会调用我的函数。
当我使用自己的容器应用程序时(仅exe
调用Loadlibrary
,GetProcAddress
和ENTRY_POINT
函数本身),所有断点都会被触发,并且步骤 - 像往常一样可以进行逐步调试。
什么可能导致这种行为?
答案 0 :(得分:2)
MessageBox()为您提供足够的绳索来解决此问题。显示时,使用Debug + Break All进入调试器。接下来,使用Debug + Windows + Modules,在列表中找到DLL。右键单击它并选择“符号加载信息”。您将获得调试器搜索PDB文件的所有目录的列表。确保其中一个存在。
Fwiw,你的命令参数设置不是犹太教。它应该是"$(TargetPath)" ENTRY_POINT
。双引号以避免路径名中的空格出现问题,无需逗号。
答案 1 :(得分:1)
简而言之:由于在32Bit
环境中调试64Bit
dll,所有问题都出现了。
从原始问题和评论中提到的附带问题可以看出,我在这里遇到的问题很少:
原因是,当调试器为32Bit
时,dll为64Bit
。 rundll32.exe
作为64Bit
版本进行干扰的路径。这通常会导致WOW64
启动32Bit
版本的子流程 - 因此不同的流程因此调试器不存在。
谢谢大家。