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

Set breakpoint at function inside dll in Visual Studio?

提问人:Luchian Grigore 提问时间:5/13/2016 更新时间:5/13/2016 访问量:2297

问:

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

有没有办法在Visual Studio中执行此操作?

我尝试过“断点 -> 新 -> 函数中断”。如果这行得通,我不会问。:)

C++ Visual-Studio 调试

评论

0赞 Karsten Koop 5/13/2016
您是否尝试在加载 DLL 后设置断点?

答:

2赞 chenjun 5/13/2016 #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上设置断点,但您需要做一些工作来调用包装器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”时停止

看到这个bolg

评论

0赞 Luchian Grigore 5/13/2016
这不是一个选项,functionName 是从该 dll 和其他 dll 内部调用的。
1赞 chenjun 5/13/2016
从谷歌找到这个,希望对你有所帮助
0赞 stijn 5/13/2016
@chenjun将其添加到答案中(不仅仅是链接,还有文本),第二点肯定有办法做到这一点
0赞 Luchian Grigore 5/13/2016
@chenjun这正是我所做的,稍后将更新这个问题。如果你发帖,我会标记你的答案。
0赞 sameerkn 5/13/2016 #2

您将需要包含要调试的函数的源代码文件。 有信息/指示让你发挥作用。https://en.wikipedia.org/wiki/Program_databasepdb files

评论

1赞 Luchian Grigore 5/13/2016
不,您不需要源文件。查看 chenjun 的评论(希望很快得到答案)
0赞 sameerkn 5/13/2016
@LuchianGrigore:所以你只想让程序控件停在函数大小不大的DLL上。没有尝试过博客中提到的东西,但您是否也希望调试函数的源代码?另外,在你执行了博客中提到的事情之后,你是否能够看到实际的源代码行(我想你不能)。请更新。