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

时间:2016-05-13 06:34:31

标签: c++ visual-studio debugging

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

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

我尝试过“Breakpoints - > New - > Break at function”。我不会问那是否有效。 :)

2 个答案:

答案 0 :(得分:2)

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”

时调试器将停止

see this bolg

答案 1 :(得分:0)

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