我正在制作一个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的主体留空。我仍然收到相同的断言失败。
答案 0 :(得分:0)
is_plausible_guest_addr(sym_avmas.main)正在检查提供的地址是否为有效的访客地址。
您编写的代码不提供有效的访客地址 getint包装代码不是客户代码,而是主机代码(valgrind工具的一部分)。
要包装函数,必须将包装代码放在应用程序或工具预加载的共享库中。
参见例如memcheck Makefile.am正在构建一个preload共享lib来包装 或替换strcpy等函数。