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

Vil*_*lx- 5 c++ debugging dll breakpoints visual-studio-2013

我正在研究DLL的源代码(用C++编写),这是另一个程序的插件.没有文档,我没有主程序的源代码.我想弄清楚主程序调用DLL的位置和时间.有超过一百个功能标记为DllExport,所以单独没有太多帮助.

为此,如果每次执行到达DLL中的代码时都可以触发断点,那将是很好的.那或者记录在某个地方.这可能吗?怎么样?

Pue*_*tis 5

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_*
Run Code Online (Sandbox Code Playgroud)

相应地设置每个断点-非常简单

当然,缺点是您必须使用外部调试器。Visual Studio确实支持功能相似的功能断点,但据我所知,它们要么在每种情况下都不适用于通配符,要么它们已在VS2013 +中进行了更改(其中之一)。

这是我所知道的最简单的方法(不是没有,但我只是不知道)。第二个最简单的方法:手动添加一次断点,如果以后需要再次使用断点,则保存您的.suo文件。这是一项繁琐的任务,但是寻找更快解决方案的时间可能比手工完成要花费更长的时间(以工作日为单位)。

其他情况是您编写了一个程序,在导出的函数的开头添加了一个蹦床(读取PE标头并获取函数的RVA),int 3并带有和原始指令,但这实在是太过分了-您很容易会设置断点在执行此操作之前,请先手动设置1000个功能。

另一种方法是更改​​存储断点的.suo解决方案选项文件。但是,据我所知,这些只能通过Visual Studio的Extensibility API获得,这意味着您必须为Visual Studio本身编写一个插件或宏。

我对此也很感兴趣。因此,我将在一段时间内观察这个问题,也许有人会知道更简单的解决方案。如果您是WinDbg的新手,只需添加一条评论,我将尽力解释您如何获得它以及它如何工作的:)