提问人:Luchian Grigore 提问时间:5/13/2016 更新时间:5/13/2016 访问量:2297
在Visual Studio中dll内的函数处设置断点?
Set breakpoint at function inside dll in Visual Studio?
问:
我想在位于 dll 中的特定函数上设置断点。pdb 是公开的,所以我知道函数名称(比如),但没有来源。namespace1::namespace2::className::functionName
有没有办法在Visual Studio中执行此操作?
我尝试过“断点 -> 新 -> 函数中断”。如果这行得通,我不会问。:)
答:
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”时停止
评论
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上。没有尝试过博客中提到的东西,但您是否也希望调试函数的源代码?另外,在你执行了博客中提到的事情之后,你是否能够看到实际的源代码行(我想你不能)。请更新。
评论