gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:10 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

My idea would be to use fork() right after the data loading phase and then hand the children off to 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 并等待它完成。所有其他 child 都将忙于等待,直到您准备好使用它们。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com