Valgrind包裹着varargs?

时间:2011-08-28 14:55:05

标签: valgrind

我认为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;
}

1 个答案:

答案 0 :(得分:2)

在文件coregrind / m_syswrap / syswrap-linux.c中的valgrind源中查看sys_ioctl的syswrappers。

查看http://valgrind.org/docs/manual/dist.readme-missing.html了解详情。

也许您需要使用syswrappers的更改来重建valgrind。