P,这是你的要求.但说实话,这可能是非常有用的东西,即使对于其他场景也是如此.
我认为你可以实现这一目标的最简单方法是使用WinDbg并在那里设置断点.使用WinDbg,您可以执行以下操作(假设您的图像名为myplugin.dll):
>打开WinDbg
>文件 – >符号文件路径(添加插件的.pdb所在的路径)
>文件 – >源文件路径(添加插件源的路径)
>文件 – >图像文件路径(添加插件DLL本身所在的路径)
>文件 – >打开可执行文件(或附加到现有进程,选择主应用程序)
>在命令行:bm myplugin!*
>运行程序(F5)
步骤6将在myplugin.dll中的每个符号处添加断点.但请注意:这将在每个函数中添加一个断点,即使在您可能没有自己定义但通过头文件(如STL)包含的函数中也是如此.这是在模块中到处设置断点的最激进方式.如果插件的编程方式是所有导出的函数都位于命名空间中,或者使用前缀,则可以减少搜索模式并获得更准确的断点.让我们假设你感兴趣的所有这些函数都以PLG_为前缀,然后你会写:
bm myplugin!PLG_*
让每个断点都相应地设置 – 非常直截了当.
当然缺点是您必须使用外部调试器. Visual Studio中做的工作相似,但据我所知,他们要么不很好使用通配符在每一个情况下工作的支持功能断点,或者他们在VS2013已经改变了它,无论是其中之一.
这是我所知道的最简单的方法(不是没有,但我根本不知道).第二个最简单的方法:手动添加断点,如果稍后再次需要断点,则保存.suo文件.这是一项繁琐的任务,但寻求更快的解决方案可能需要比手工操作更长的时间(在工作日计算).
另一些人,你写一个程序,在您的导出函数一开始就增加了一个蹦床(读PE头,并得到职能的RVA)与INT 3和原来的指令,但是这是矫枉过正 – 你轻松拥有在完成此操作之前,手动将断点放入1000个函数中.
另一种方法是更改存储断点的.suo解决方案选项文件.但是,据我所知,这些只能通过Visual Studio的可扩展性API获得,这意味着您必须为Visual Studio本身编写插件或宏.
我也对此非常感兴趣.所以我会在一段时间内观察这个问题,也许有人知道更简单的解决方案.如果您是WinDbg新手,只需添加评论,我将尝试解释您是如何获得它以及它是如何工作的:)