我试图用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"
函数。