Возможно ли записать состояние программы в Valgrind/DrMemory, а затем восстановить его?
У меня есть программа, которая загружает большой кусок данных при запуске. Это занимает довольно много времени и поэтому создает издержки при запуске Valgrind ( memcheck
) / DrMemory. Так что при вызове программы несколько раз с разными аргументами это занимает значительное время
Моя идея будет использовать fork()
сразу после фазы загрузки данных, а затем передать детей в Valgrind/DrMemory. Даже если фаза загрузки выполняется в Valgrind/DrMemory, накладные расходы будут происходить только один раз и все fork
Дочерние процессы должны иметь возможность использовать предварительно загруженные данные оттуда.
Можно ли записать состояние программы и объявить его незапятнанным, а затем восстановить это состояние в Valgrind (memcheck
) или DrMemory?
Примечание: меня интересуют только Unixoid-платформы, поэтому было бы неплохо ограничиться только Linux.
1 ответ
Моя идея состоит в том, чтобы использовать fork() сразу после фазы загрузки данных, а затем передать потомков Valgring/DrMemory.
Это невозможно по многим причинам. Например, glibc
будет кешировать результаты syscall(SYS_getpid)
во внутренней переменной, и имея несколько процессов, которые считают, что они имеют один и тот же 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
и дождаться его завершения. Все остальные дети будут приятно заняты, ожидая, пока вы не будете готовы их использовать.