Возможно ли записать состояние программы в 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 и дождаться его завершения. Все остальные дети будут приятно заняты, ожидая, пока вы не будете готовы их использовать.

Другие вопросы по тегам