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

时间:2014-11-23 15:14:56

标签: c++ debugging dll visual-studio-2013 breakpoints

我正在研究DLL的源代码(用C ++编写),这是另一个程序的插件。没有文档,我没有主程序的源代码。我想弄清楚主程序调用DLL的位置和时间。有超过一百个标记为DllExport的函数,因此仅此一点没有多大帮助。

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

1 个答案:

答案 0 :(得分:5)

P,这是你的要求。但说实话,这可能是非常有用的东西,即使对于其他情况也是如此。

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

  1. 打开WinDbg
  2. 档案 - > 符号文件路径(添加插件的.pdb所在的路径)
  3. 档案 - > 源文件路径(添加插件源的路径)
  4. 档案 - > 图像文件路径(添加插件DLL本身所在的路径)
  5. 档案 - > Open Executable (或附加到现有流程,选择主应用程序)
  6. 在命令行:bm myplugin!*
  7. 运行程序(F5)
  8. 步骤6将在myplugin.dll的每个符号处添加断点。但请注意:这将在每个函数中添加一个断点,即使在您可能没有自己定义但通过头文件(如STL)包含的函数中也是如此。这是在模块中到处设置断点的最激进方式。如果插件的编程方式是所有导出的函数都位于命名空间中,或者使用前缀,则可以减少搜索模式并获得更准确的断点。让我们假设您感兴趣的所有这些函数都以PLG_为前缀,然后您会写:

    bm myplugin!PLG_*
    

    相应地设置每个断点 - 非常直接。

    缺点当然是你必须使用外部调试器。 Visual Studio确实支持类似工作的功能断点,但据我所知,他们要么在每种情况下都不能使用通配符,要么在VS2013 +中更改了它们,其中一个

    这是我所知道的最简单的方法(不是没有,但我根本不知道)。第二个最简单的方法:手动添加断点,如果稍后再次需要断点,则保存.suo文件。这是一项繁琐的任务,但寻求更快的解决方案可能比手工完成更长的时间(在工作日计算)。

    其他人是你编写了一个程序,在你导出的函数的最开头添加一个蹦床(读取PE头并得到函数的RVA)和int 3以及原始指令,但是这是过度的 - 在完成此操作之前,您可以轻松地在1000个函数中放置断点。

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

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