繁体   English   中英

如何在Visual Studio中的DLL上设置断点?

[英]How to set a breakpoint on a DLL in Visual Studio?

我正在研究DLL(用C ++编写)的源代码,该DLL是另一个程序的插件。 没有文档,而且我没有主程序的源代码。 我试图弄清楚主程序在何时何处调用DLL。 有100多个标记为DllExport函数,因此仅此一项并没有多大帮助。

为此,如果每次执行到达DLL中的代码时都可以触发一个断点,那就太好了。 那或记录在某个地方。 这有可能吗?

ew,这是您的一项相当要求。 但老实说,即使对于其他情况,这也可能确实有用。

我认为可以实现此目的的最简单方法是使用WinDbg并在那里设置断点。 使用WinDbg,您可以执行以下操作(假设您的映像名为myplugin.dll ):

  1. 打开WinDbg
  2. File- > Symbol File Path (添加插件的.pdb所在的路径)
  3. 文件 -> 源文件路径 (添加插件源所在的路径)
  4. 文件 -> 图像文件路径 (添加插件DLL本身所在的路径)
  5. 文件 -> 打开可执行文件 (或附加到现有进程,选择主应用程序)
  6. 在命令行上: bm myplugin!*
  7. 运行程序(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的新手,只需添加一条评论,我将尽力解释您如何获得它以及它如何工作的:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM