1

我有一个在启动时加载大量数据的程序。这会占用相当长的时间,因此在运行Valgrind( memcheck) / DrMemory时会产生开销。所以当用不同的参数多次调用程序时,会占用相当多的时间

我的想法是fork()在数据加载阶段之后立即使用,然后将孩子交给 Valgrind/DrMemory。即使加载阶段在 Valgrind/DrMemory 下运行,开销也只会发生一次,并且所有forked 子进程应该能够从那里使用预加载的数据。

记录程序状态并将其声明为未污染,然后在 Valgrind ( memcheck) 或 DrMemory 中恢复该状态是否可行?

注意:我只对 unixoid 平台感兴趣,将其限制在 Linux 上也可以。

4

1 回答 1

1

我的想法是在数据加载阶段之后立即使用 fork(),然后将孩子交给 Valgring/DrMemory。

由于许多原因,这是不可行的。例如,glibc将结果缓存syscall(SYS_getpid)在一个内部变量中,并且让多个进程相信它们具有相同的 pid(它们!=的真实 pid)显然是灾难的根源。

也就是说,是什么阻止您在初始化后运行valgrind --trace-children=yes然后ing 子进程?fork每个子进程都可以执行以下操作:

char buf[PATH_MAX];
sprintf(buf, "/tmp/parameters-for-%d", getpid());
while (true) {
  if (FILE *fp = fopen(buf, "r")) {
    // read parameters for this child, and exercise appropriate code paths
    return run_with_parameters(fp);
  }
  sleep(1);
}

当您希望孩子N运行时,只需echo "foo bar baz" > /tmp/parameters-for-N等待它完成即可。所有其他孩子都会忙得不可开交,直到您准备好使用它们。

于 2013-04-15T04:15:23.210 回答