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



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

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

我尝试过"断点 ->新的 -> 函数中断"。如果这奏效了,我不会问。:)

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"(通常,系统dlls不会被重新定位,因此此处的图像基值等于PE文件中写入的值(。那么"GetMessageW"的起始地址是"7E410000+000091C6= 7E4191C6"。只需在此地址设置一个函数断点即可。然后调试器将在调用"GetMessageW"时停止

查看此博格

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

最新更新