我想在位于dll中的特定函数上设置断点。 pdb是公共的所以我知道函数名称(比如namespace1::namespace2::className::functionName
),但没有来源。
有没有办法在Visual Studio中执行此操作?
我尝试过“Breakpoints - > New - > Break at function”。我不会问那是否有效。 :)
答案 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”
时调试器将停止
答案 1 :(得分:0)
您将需要包含要调试的功能的源代码文件。 pdb files
有信息/指示让您开始运作。
https://en.wikipedia.org/wiki/Program_database