我正在尝试使用Valgrind拦截一个函数,根据他们的示例。
当我使用gcc编译时,我能够拦截全局函数,但是当我用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++编译时,输出结果只有:
inside foo
_Z3foov
的对象名称。(C ++对C名称进行名称重整)。 (使用readelf -s文件
倒出符号表。)但是,仅仅通过在程序中用_Z3foov
替换foo
就无法得到正确的结果。所以我很困惑。不过还是谢谢你给我展示了这个问题 :) - sarnoldextern "C"
包装函数吗?可能存在问题是因为I_WRAP_SONAME_FNNAME_ZU
函数名被搞乱了。 - jswolf19