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);
}
当您希望childN
运行时,只需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是的,没错。没有特别的支持(除了追踪孩子的能力)是必要的。太好了,这实际上回答了我的问题。Спасибо большое!