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

Linux 在Valgrind/DrMemory中记录程序状态,然后恢复该状态是否可行?,linux,fork,valgrind,memcheck,dr-memory,Linux,Fork,Valgrind,Memcheck,Dr Memory,我有一个在启动时加载大量数据的程序。这会占用相当长的时间,因此在运行/时会产生开销。因此,当使用不同的参数多次调用程序时,会占用大量的时间 我的想法是在数据加载阶段之后立即使用fork(),然后将孩子们交给Valgrind/DrMemory。即使加载阶段在Valgrind/DrMemory下运行,开销也只会发生一次,所有forked子进程都应该能够从那里使用预加载的数据 是否可以记录一个程序状态并声明它未被污染,然后在Valgrind(memcheck)或DrMemory中恢复该状态 注意:我只

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

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

是否可以记录一个程序状态并声明它未被污染,然后在Valgrind(
memcheck
)或DrMemory中恢复该状态

注意:我只对unixoid平台感兴趣,仅限Linux也可以

我的想法是在数据加载阶段之后立即使用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);
}
当您希望child
N
运行时,只需
echo“foo bar baz”>/tmp/parameters-for-N
并等待它完成。所有其他孩子都会很忙地等待,直到你准备好使用他们

我的想法是在数据加载阶段之后立即使用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);
}

当您希望child
N
运行时,只需
echo“foo bar baz”>/tmp/parameters-for-N
并等待它完成。所有其他孩子都会很忙地等待,直到你准备好使用它们。

所以你说的是从一开始就在Valgrind下运行它,只需
fork()
?@0xC000002L是的,没错。没有特别的支持(除了追踪孩子的能力)是必要的。太好了,这实际上回答了我的问题。Спасибо большое!因此,您要说的是从一开始就在Valgrind下运行它,只需
fork()
?@0xC000002L是的,没错。没有特别的支持(除了追踪孩子的能力)是必要的。太好了,这实际上回答了我的问题。Спасибо большое!