使用g ++在Linux上用Valgrind拦截全局函数

我试图用Valgrind来拦截一个函数,根据他们的例子 。

使用gcc构build时,我能够完成全局函数的拦截,但是当我用g ++编译相同的代码时,拦截不起作用。

在我应该指定的编译器标志中有什么特别的?

这是我的示例应用程序:

#include <stdio.h> #include "valgrind.h" __attribute__ ((noinline)) void foo() { printf("inside foo\n"); } void I_WRAP_SONAME_FNNAME_ZU(NONE,foo)() { OrigFn fn; VALGRIND_GET_ORIG_FN(fn); printf("*** Before foo()\n"); CALL_FN_v_v(fn); printf("*** After foo()\n"); } int main() { foo(); return 0; } 

当用GCC编译时,输出是:

*** Before foo()
inside foo
*** After foo()

但是,当用g ++编译时,输出很简单

在里面

G ++没有extern "C"做一个名字为函数调用。 所以你应该找到一个错位的名字(例如nm object ),并在你的valgrind代码中使用它。 或者你可以重写你的目标程序来使用extern "C"函数。