我有一个程序在启动时加载大量数据。这需要相当长的时间,因此在运行Valgrind (memcheck
) / DrMemory时会产生开销。因此,当使用不同的参数多次调用程序时,会花费相当多的时间
我的想法是在数据加载阶段后立即使用fork()
,然后将孩子交给Valgrind / DrMemory。即使加载阶段在Valgrind / DrMemory下运行,开销也只会发生一次,并且所有fork
ed子进程都应该能够使用那里的预加载数据。
记录程序状态并将其声明为无污染,然后在Valgrind(memcheck
)或DrMemory中恢复该状态是否可行?
注意:我只对unixoid平台感兴趣,将其限制为Linux也没关系。
答案 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
并等待它完成。所有其他孩子都会很忙 - 等到你准备好使用它们之后。