在 C++ (Visual Studio) 中查找函数的调用者
Posted
技术标签:
【中文标题】在 C++ (Visual Studio) 中查找函数的调用者【英文标题】:Find caller of function in C++ (Visual Studio) 【发布时间】:2018-01-09 17:49:30 【问题描述】:我有一个不能在 WinXP 下运行的 Visual Studio 2015 C++ 项目,因为函数 getTickCount64() 在某处被调用(仅 Vista 和更高版本)。该函数位于外部库 Kernel32.dll 中,因此我无法将其声明为已弃用以获取编译器警告。
我检查了很多次,我没有自己调用该函数,它必须在我正在使用的第 3 方库中。
我怎样才能知道函数在哪里被调用?
【问题讨论】:
我觉得你需要调试一下...ericlippert.com/2014/03/05/how-to-debug-small-programs 我会在可执行文件上使用Dependency Walker 来找出答案。 @UKMonkey 缺少依赖项的程序根本不会启动,更不用说可调试了。 @Quentin 正确,但它没有缺少依赖项,dll 存在。 dll中的函数没有,所以运行时会失败。 你应该调试它并在调用该函数时查看调用堆栈。 @UKMonkey:不,它不是特定于应用程序的。当操作系统加载程序尝试加载任何对缺少的 DLL 函数具有静态依赖关系的可执行文件时,它本身会引发该错误。您将没有任何机会调试可执行文件,因为根本没有创建进程。 【参考方案1】:使用函数断点(Debug->New Breakpoint->Function breakpoint),然后调用堆栈查看它是从哪里调用的。
【讨论】:
只有在应用程序在运行时成功加载时才有效。如果函数是静态链接的,应用将无法加载。 成功加载应用没有问题。我只会在Win7下做!好的,该解决方案对我来说听起来不错,问题是,它不是我正在谈论的简单可执行文件,而是必须加载到数字音频工作站中的 VST 插件(= sound thingy)。所以我必须弄清楚如何调试这些东西......无论如何感谢您的回答!【参考方案2】:您将无法在运行时使用调试器找到罪魁祸首,因为您的程序将无法在运行时加载。您必须搜索应用程序静态使用的每个 3rd 方库,直到找到静态调用该函数的库。如果您没有库的源代码,您至少可以搜索目标文件或导入与您的应用程序链接的库,查找对该函数的任何引用。
【讨论】:
以上是关于在 C++ (Visual Studio) 中查找函数的调用者的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?
visual studio------初建一个c++项目流程
我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?