在valgrind中包装函数时失败的断言

时间:2015-10-04 01:45:17

标签: c valgrind wrapping

我正在制作一个valgrind工具。我想包装一个函数“int getint(int x)”。当我运行我的工具时,断言失败。无论客户端程序是否包含getint(),都会失败。

==20490== wg-1.0, description
==20490== will
==20490== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info
==20490== Command: ./small2
==20490== 

valgrind: m_redir.c:627 (vgPlain_redir_notify_new_DebugInfo): Assertion 'is_plausible_guest_addr(sym_avmas.main)' failed.
Segmentation fault (core dumped)

这是我的wg_main.c

#include "pub_tool_basics.h"
#include "pub_tool_tooliface.h"
#include "pub_tool_redir.h"
#include "valgrind.h"

int VG_WRAP_FUNCTION_ZU(NONE, getint)(int x);
int VG_WRAP_FUNCTION_ZU(NONE, getint)(int x)
{
  int result;
  OrigFn fn;
  VALGRIND_GET_ORIG_FN(fn);
  CALL_FN_W_W(result, fn, x);
  return result;
}
static void wg_post_clo_init(void) {}

static IRSB* wg_instrument(VgCallbackClosure* closure, IRSB* bb_in,
                           const VexGuestLayout* layout,
                           const VexGuestExtents* vge,
                           const VexArchInfo* archinfo_host, IRType gWordTy,
                           IRType hWordTy) {

  return bb_in;
}

static void wg_fini(Int exitcode) { VG_(printf)("Finished!"); }

static void wg_pre_clo_init(void) {
  VG_(details_name)("wg");
  VG_(details_version)("1.0");
  VG_(details_description)("description");
  VG_(details_copyright_author)("will");
  VG_(details_bug_reports_to)(VG_BUGS_TO);

  VG_(details_avg_translation_sizeB)(275);

  VG_(basic_tool_funcs)(wg_post_clo_init, wg_instrument, wg_fini);

  /* No needs, no core events to track */
}

VG_DETERMINE_INTERFACE_VERSION(wg_pre_clo_init)

我也尝试将VG_WRAP_FUNCTION_ZU的主体留空。我仍然收到相同的断言失败。

1 个答案:

答案 0 :(得分:0)

is_plausible_guest_addr(sym_avmas.main)正在检查提供的地址是否为有效的访客地址。

您编写的代码不提供有效的访客地址 getint包装代码不是客户代码,而是主机代码(valgrind工具的一部分)。

要包装函数,必须将包装代码放在应用程序或工具预加载的共享库中。

参见例如memcheck Makefile.am正在构建一个preload共享lib来包装 或替换strcpy等函数。