_penter由标准库函数调用

时间:2014-07-18 11:02:18

标签: visual-studio-2013 profiler static-linking

我正在编写一个探查器库,其任务是在应用程序执行时打印函数的名称。为了实现这一点,我使用/ Gh标志编译了app并将其链接到具有_penter定义的探查器。 _penter调用一个检索名称并打印它的函数。这种情况正确发生。

要删除两次打印相同功能的实例,我在分析器中使用了unordered_set。

这也很有效;除非应用程序包含unordered_set类并使用它的方法。

当应用程序执行此操作时,探查器对unordered_set方法的调用也会调用_penter,从而将代码置于无限递归循环中,并导致堆栈溢出。我确保不使用/ Gh标志构建探查器。

我的猜测是,探查器和应用程序使用包含unordered_set方法的标准库的相同副本。但我不知道如何解决这个问题。

我真的需要帮助解决这个问题。

非常感谢。

注:

  1. 我正在使用Visual Studio 2013
  2. profiler是一个静态库。
  3. 使用/ MTd标志构建了profiler.lib和Application.exe
  4. 分析器将libcpmtd.lib作为附加依赖
  5. 来自libcmtd.lib的函数(如printf)没有调用_penter。来自分析器或应用程序。

1 个答案:

答案 0 :(得分:0)

我认为您需要确保每个文件都提供/ Gh选项,而不是整个解决方案/项目。当/ Gh被提供给某个编译单元(即.cpp文件)时,它将使用_penter对文件中的每个函数进行检测。当然,这适用于此cpp文件中具有函数定义的标头。 std :: unordered_set中的函数已经过检测,因为它们位于已检测的编译单元中。我会尝试使用预编译的标题,或者以某种方式你需要将定义移出你使用的文件/ Gh。