2013-04-05 2 views
1

У меня есть программа, которая загружает большой кусок данных при запуске. Это занимает довольно много времени и поэтому создает накладные расходы при запуске Valgrind (memcheck)/DrMemory. Поэтому, когда вы вызываете программу несколько раз с разными аргументами, это занимает значительное количество времени.Возможно ли записать состояние программы в Valgrind/DrMemory, а затем восстановить это?

Моей идеей было бы использовать fork() сразу после фазы загрузки данных, а затем передать детей в Valgrind/DrMemory. Даже если фаза загрузки работает под Valgrind/DrMemory, служебные данные будут возникать только один раз, и все дочерние процессы fork должны иметь возможность использовать предварительно загруженные данные.

Возможно ли записать состояние программы и объявить ее незадействованной, а затем восстановить это состояние в 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

+0

@ 0xC0000022L Да, точно. Никакой специальной поддержки (помимо способности отслеживать детей) не требуется. –

+0

отлично, это на самом деле отвечает на мой вопрос. Спасибо большое! – 0xC0000022L