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

Failed assertion when wrapping function in valgrind

我正在制作一个 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 的正文留空。我仍然收到相同的断言失败。

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

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

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

参见例如memcheck Makefile.am 正在构建一个预加载共享库来包装 或者替换函数如strcpy.