2013-04-05 51 views
1

我有一个程序在启动时加载一大块数据。这需要相当长的时间,因此在运行Valgrind (memcheck)/DrMemory时会产生开销。因此数次使用不同的参数调用程序时,它占用了大量的时间在Valgrind/DrMemory中记录程序状态,然后恢复它是否可行?

我的想法是使用fork()数据加载阶段之后再用手将孩子送到Valgrind的/ DrMemory。即使加载阶段在Valgrind/DrMemory下运行,开销也只会发生一次,所有子进程都应该能够使用预加载的数据。

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

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

回答

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并等待它完成。所有其他孩子都会很忙,等待你准备好使用它们。

+0

所以你说的是从一开始就在Valgrind下运行它,并且简单地使用'fork()'? – 0xC0000022L 2013-04-15 12:59:46

+0

@ 0xC0000022L是的,正好。没有特别的支持(超越追踪儿童的能力)是必要的。 – 2013-04-15 13:58:15

+0

太棒了,那实际上回答了我的问题。 Спасибобольшое! – 0xC0000022L 2013-04-15 14:00:47

相关问题