我认为valgrind中的包装器框架非常好。我试图跟踪不同代码路径之间的差异(为什么一个工作,另一个不工作)。而不是试图查看strace
输出的差异(它不会给我我需要的所有细节,因为我想跟踪lib和sys调用,我决定使用几个函数的包装器。
让我挠头的一个功能是fcntl
。
fcntl联机帮助页声明如下
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
然而,由于这是C
并且C
不会自然地进行重载,因此fcntl.h
extern int fcntl (int __fd, int __cmd, ...);
valgrind中的最终用户包装工具支持N个WORD参数,但是有关使用错误数量的args的警告,我没有看到任何varargs的提及。
像printf
这样更经典的varargs函数通常使用较低的固定args函数vprintf
来实现,该函数将va_list
作为单个参数。在这种情况下,我会包裹vprintf
而不是printf
,但唉AFAIK fcntl
没有这样的中间函数。
我的问题是 - fcntl
的“安全”包装器会是什么样的?
例如,以下似乎可以正常工作,但它是安全的:
int I_WRAP_SONAME_FNNAME_ZU(libcZdsoZa,fcntl)(int fd, int cmd, ...)
{
int result;
OrigFn fn;
void* arg;
va_list argp;
va_start(argp, cmd);
arg=va_arg(argp, void*);
VALGRIND_GET_ORIG_FN(fn);
printf("@@fcntl wrapper: args fd=%d, cmd=%d, arg=%p ... ", fd, cmd, arg);
CALL_FN_W_WWW(result, fn, fd, cmd, arg);
printf("##fcntl wrapper: result %d\n", result);
return result;
}
答案 0 :(得分:2)
在文件coregrind / m_syswrap / syswrap-linux.c中的valgrind源中查看sys_ioctl的syswrappers。
查看http://valgrind.org/docs/manual/dist.readme-missing.html了解详情。
也许您需要使用syswrappers的更改来重建valgrind。