我正在研究一款用C++编写的DLL源代码,它是另一个程序的插件。由于没有文档,而且我也没有主程序的源代码,所以我正试图找出主程序何时、在哪里调用该DLL。有100多个函数被标记为“DllExport”,但这并没有什么帮助。
因此,如果能够在我的DLL中每次执行达到某段代码时触发断点,或者在某处记录下来,那就太好了。这是否可行?如何实现呢?
因此,如果能够在我的DLL中每次执行达到某段代码时触发断点,或者在某处记录下来,那就太好了。这是否可行?如何实现呢?
哇,您的要求真是不小。但说实话,这可能对其他场景也非常有用。
我认为最简单的方法是使用WinDbg并在其中设置断点。使用WinDbg,您可以这样做(假设您的映像文件名为myplugin.dll
):
bm myplugin!*
第6步将在myplugin.dll
中的每个符号处添加一个断点。但请注意:这确实会在每个函数处添加断点,甚至包括您没有自己定义但通过头文件(如STL)包含的函数。这是在模块中设置断点的最激进方式。如果插件以所有导出函数都位于命名空间或具有前缀的方式编程,则可以缩小搜索模式并获得更准确的断点。假设您感兴趣的所有这些函数都以PLG_
为前缀,那么您将编写:
bm myplugin!PLG_*
dumpbin
实用程序。通过它,我可以看到DLL有2432个导出函数。我怀疑它们并不全部被调用,但是没有办法确定... - Vilx-WinDbg
,也许可以找到并下载它,但是我对汇编和 CPU 的内部工作经验很少。我发现这个主题很有趣,在学习的过程中也学到了一些东西,但还不足以阅读和理解汇编代码。 :( - Vilx-#define
并以某种方式影响所有导出函数...但我不知道是否有任何有用的操作。 - Vilx-__asm int 3;
即可 ;) 这将触发一个断点(应该会弹出一个窗口,您可以在其中选择调试器,它应该是“Visual Studio 20XX”)。但这样做与在每个函数中手动设置断点完全相同,如果没有自动化,那将是耗时的。虽然我没有AspectC++的经验,但看了几个例子后,在与所述__asm
指令结合使用时,可能非常可行... - PuerNoctis