我有一个程序,可以在启动时加载大量数据。这需要相当长的时间,因此在运行Valgrind (memcheck)/DrMemory时会产生开销。因此,当用不同的参数多次调用程序时,需要花费相当长的时间
我的想法是在数据加载阶段之后立即使用fork(),然后把孩子们交给valgrind/drmemory。即使加载阶段在valgrind/drmemory下运行,开销也只会出现一次,所有forked子进程都应该能够使用其中的预加载数据。
在valgrind(memcheck)或drmemory中记录一个程序状态并将其声明为未着色,然后再还原该状态是否可行?
注意:我只对unixoid平台感兴趣,仅限于linux也可以。

最佳答案

我的想法是在数据加载阶段之后立即使用fork(),然后把孩子们交给valgring/drmemory。
这不可行有很多原因。例如,glibc将在一个内部变量中缓存syscall(SYS_getpid)的结果,并且有多个进程认为它们具有相同的pid(这是!=它们的真实pid)显然会导致灾难。
也就是说,是什么阻止您在初始化后运行valgrind --trace-children=yesfork子进程?每个子进程都可以执行以下操作:

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);
}

当您想让childN运行时,只需echo "foo bar baz" > /tmp/parameters-for-N并等待它完成。所有其他的孩子都会很忙地等你准备好使用它们。

关于linux - 在Valgrind/DrMemory中记录程序状态然后恢复该状态是否可行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15836646/

10-12 00:44