在 Visual Studio 中的 dll 内的函数处设置断点?

Posted

技术标签:

【中文标题】在 Visual Studio 中的 dll 内的函数处设置断点?【英文标题】:Set breakpoint at function inside dll in Visual Studio? 【发布时间】:2016-05-13 06:34:30 【问题描述】:

我想在位于 dll 中的特定函数处设置断点。 pdb 是公开的,所以我知道函数名称(比如 namespace1::namespace2::className::functionName),但没有来源。

有没有办法在 Visual Studio 中做到这一点?

我尝试过“断点 -> 新建 -> 函数中断”。我不会问这是否有效。 :)

【问题讨论】:

DLL 加载后是否尝试设置断点? 【参考方案1】:
void wrapper_func(parameters...)
    // call the real function
    std::cout<<"before call dll func"<<std::endl;
    namespace1::namespace2::className::functionName(parameters...);
    std::cout<<"after call dll func"<<std::endl;

然后在 wrapper_func 上设置断点。但是你需要做一些工作来调用 wrapper func 而不是 dll func。

另一种方法是在函数地址上设置断点

如果你不喜欢加载 NT 符号,还有另一种方法 使用一些 PE 工具获取要在其中设置断点的函数的相对地址。例如,只需在 Visual Studio 命令行中键入“dumpbin /exports C:\Windows\System32\user32.dll”,即可在“user32.dll”中获取每个导出符号的“RVA”。例如,“GetMessageW”的“RVA”是“000091C6”。

现在在VS调试器的“模块”窗口中查看“user32.dll”的镜像库,在我的笔记本电脑上的值为“7E410000”(一般系统dll不会被重定位,所以这里的镜像库值为等于写入PE文件的值)。那么“GetMessageW”的起始地址就是“7E410000+000091C6=7E4191C6”。只需在这个地址设置一个函数断点。然后调试器将在调用“GetMessageW”时停止

see this bolg

【讨论】:

这不是一个选项,functionName 是从那个和其他 dll 内部调用的。 从谷歌找到this,希望对您有所帮助 @chenjun 将其添加到答案中(不仅仅是链接,还有文字),第二点肯定有办法 @chenjun 这正是我所做的,稍后将更新这个问题。如果您发布,我会标记您的答案。【参考方案2】:

您将需要包含您要调试的功能的源代码文件。 pdb files 有信息/指导让您发挥作用。 https://en.wikipedia.org/wiki/Program_database

【讨论】:

不,您不需要源文件。见 chenjun 的评论(希望很快有答案) @LuchianGrigore:所以你只是想让程序控制停止在一个函数大小的 DLL 上。没试过博客里提到的东西,但是你希望调试函数的源代码吗?同样,在您执行了博客中提到的事情之后,您是否能够看到实际的源代码行(我想您看不到)。请更新。

以上是关于在 Visual Studio 中的 dll 内的函数处设置断点?的主要内容,如果未能解决你的问题,请参考以下文章

在Visual Studio开发的项目中引用GAC中的dll

DLL 中的 Python (c++) Visual Studio

从 Visual Studio 2017 中的现有 VB.NET 项目创建 dll

如何修复 Visual Studio 2015 中的错误 MSVCP120D.dll?

让 dll 包含在 Visual Studio 中工作

如何解决 Visual Studio 2019 中的这个 dll 缺失问题?