我想在位于 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