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

Posted

技术标签:

【中文标题】使用 g++ 在 Linux 上使用 Valgrind 拦截全局函数【英文标题】:Intercepting global functions with Valgrind on Linux using g++ 【发布时间】:2011-06-30 16:20:49 【问题描述】:

根据their example,我正在尝试使用 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++编译时,输出很简单

在 foo 里面

【问题讨论】:

在我的系统上,当使用 C++ 编译时,我得到一个对象名称为 _Z3foov 的函数。 (C++ mangles C 名称。)(使用 readelf -s file 转储符号表。)但是,我无法通过简单地将 foo 替换为我的程序。所以我很困惑。不过,谢谢你给我看这个。 :) 你试过extern "C"-ing 函数包装器吗?可能存在问题,因为 I_WRAP_SONAME_FNNAME_ZU 函数名称被破坏。 【参考方案1】:

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

【讨论】:

以上是关于使用 g++ 在 Linux 上使用 Valgrind 拦截全局函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 g++ 在 Linux 上使用 boost/shared_ptr.hpp 编译 c++ 程序

linux 如何知道home目录挂载在哪个硬盘上

C:分析C程序的瓶颈

Valgrind的安装及简单使用

如何在Linux上使用相关的头文件编译这个C ++代码?

使用 g++ 编译,使用向量和数组库