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

4

我正在尝试使用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


2
在我的系统上,使用C ++编译时,我得到函数 _Z3foov 的对象名称。(C ++对C名称进行名称重整)。 (使用 readelf -s文件 倒出符号表。)但是,仅仅通过在程序中用 _Z3foov 替换 foo 就无法得到正确的结果。所以我很困惑。不过还是谢谢你给我展示了这个问题 :) - sarnold
你尝试过使用 extern "C" 包装函数吗?可能存在问题是因为 I_WRAP_SONAME_FNNAME_ZU 函数名被搞乱了。 - jswolf19
1个回答

2

没有extern "C"的函数,G++会对函数名进行名称编码。因此,在您的valgrind代码中,您应该查找已编码的名称(例如使用nm object),并将其用于目标程序。或者,您可以重写您的目标程序,使用一个extern "C"函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接