2013-04-05 16 views
1

시동시 큰 용량의 데이터를로드하는 프로그램이 있습니다. 오랜 시간이 걸리므로 Valgrind (memcheck)/DrMemory을 실행할 때 오버 헤드가 발생합니다. 그래서 다른 인수로 프로그램을 여러 번 호출하면 상당한 시간이 걸릴 것입니다.Valgrind/DrMemory에 프로그램 상태를 기록한 다음 복원하는 것이 가능합니까?

데이터 로딩 단계 직후에 fork()을 사용하고 아이들을 Valgrind/DrMemory에 넘기는 것이 좋습니다. 로드 단계가 Valgrind/DrMemory에서 실행 되더라도 오버 헤드는 한 번 발생하며 모든 하위 프로세스는 미리로드 된 데이터를 사용할 수 있어야합니다.

프로그램 상태를 기록하고이를 적용되지 않은 것으로 선언 한 다음 나중에 Valgrind (memcheck) 또는 DrMemory에서 해당 상태를 복원 할 수 있습니까?

참고 : 저는 유닉스 플랫폼에만 관심이 있습니다. 리눅스만으로 제한해도 괜찮습니다.

답변

1

제 아이디어는 데이터로드 단계 직후에 fork()를 사용하고 자녀를 Valgring/DrMemory에 넘기는 것입니다.

이는 여러 가지 이유로 실현 될 수 없습니다. 예를 들어, glibcsyscall(SYS_getpid)의 결과를 내부 변수에 캐시하고 동일한 프로세스 ID를 가진 여러 프로세스 (실제은 실제 ID)가 재난에 대한 확실한 제조법이라고 생각하는 프로세스를 보유합니다.

그렇다면 초기화 후 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); 
} 

당신이 단순히 echo "foo bar baz" > /tmp/parameters-for-N를 실행하고 완료 될 때까지 기다리는 아이 N을하려는 경우. 다른 모든 아이들은 당신이 그들을 사용할 준비가 될 때까지 바쁘게 기다릴 것입니다.

+0

당신이 말하는 것은 Valgrind에서 시작하여 간단히'fork()'를 실행하는 것입니다. – 0xC0000022L

+0

@ 0xC0000022L 네, 맞습니다. 특별 지원 (아동 추적 능력 이상)은 필요하지 않습니다. –

+0

위대한, 사실 그 시점에 내 질문에 대한 답변. Спасибо большое! – 0xC0000022L