在 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