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