使用 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 拦截全局函数的主要内容,如果未能解决你的问题,请参考以下文章