在 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.
我正在制作一个 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.