在Valgrind / DrMemory中记录程序状态然后恢复它是否可行?

时间:2013-04-05 14:34:49

标签: linux fork valgrind memcheck dr-memory

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

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

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

注意:我只对unixoid平台感兴趣,将其限制为Linux也没关系。

1 个答案:

答案 0 :(得分:1)

  

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

由于许多原因,这是不可行的。例如,glibc会将syscall(SYS_getpid)的结果缓存到内部变量中,并且让多个进程认为它们具有相同的pid(!=它们的真实pid)是灾难的明显方法

那就是说,什么阻止你在初始化后运行valgrind --trace-children=yes然后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并等待它完成。所有其他孩子都会很忙 - 等到你准备好使用它们之后。