2009-09-27 6 views
5

Valgrind를 사용하여 서버 응용 프로그램에서 수행 된 메모리 액세스 위반을 감지해야합니다. 서버는 많은 스레드를 생성합니다. 나는 서버가 1 시간 정도마다 충돌하게하는 경주 조건이 있다고 생각한다. Valgrind를 사용하여 메모리 사용량을 분석했지만 서버 프로세스의 속도는 크게 떨어졌습니다. 서버의 속도가 너무 빨라서 사용하기가 어려웠고 가능한 경주 조건도 없었습니다.Valgrind를 프로세스와 병렬로 실행하여 성능이 너무 많이 저하되지 않도록하려면 어떻게해야합니까?

Valgrind를 우리 응용 프로그램과 병행하여 실행하면 성능이 크게 저하되지 않습니까?

답변

5

다중 스레드 프로그램을 지원하는 동안 Valgrind는 다중 코어를 사용할 수 있으면 실제로 프로그램의 스레드를 병렬로 실행하지 않습니다. 또한 OS 운영 체제 스케줄러보다 미세한 스레드로 스레드를 인터리브합니다. 이러한 두 가지 사실을 종합하면 인종 또는 다른 동시 이례적인 프로그램이 다르게 행동 할 수 있습니다.

주로 올바른 잠금 규정을 탐지하기위한 도구 인 Helgrind과 데이터 경합을 주로 감지하는 도구 인 drd을 사용해보십시오.

1

이 질문에 직접 대답하는 것은 아니지만 동기화 오류가 의심되는 경우 Valgrind 도구 Helgrind을 사용해 보셨습니까?

+0

내가 전문적인 Valgrind 사용자가 아니기 때문에 나는 Helgrind를 알지 못했습니다. 나는 그것에 대해 지금 막 배웠다. 개체가 삭제되고 있지만 다른 스레드가 액세스하려고하면 프로세스가 충돌하는 것 같습니다. 이것은 응용 프로그램이 매우 열악하게 코딩되었으므로 가능성이 매우 높습니다. 나는 헬 그린 드를 시험해보고 그것이 제공 할 수있는 것을 보게 될 것이다. –

9

당신은 그렇게 할 수 없습니다. Valgrind는 실제로 코드를 네이티브로 실행하지 않고 대신 시뮬레이터에서 실행합니다. 그래서 너무 느립니다. 따라서 Valgrind의 장점을 더 빨리 발휘할 수있는 방법은 없습니다.

가장 좋은 방법은 프로그램이 충돌 할 때 핵심 파일을 생성하도록 ulimit을 설정하는 것입니다. 그런 다음 핵심을 검사하여 문제가 무엇인지 알아낼 수 있습니다.

+1

+1, 거의 똑같은 대답을하려고했습니다. –

0

Valgrind는 malloc 호출에 연결하여 작동하므로 valgrind에서 프로그램이 느리게 실행될 것으로 기대할 수 있습니다. 따라서 valgrind에서 프로그램을 빨리 실행할 수 없다고 말하면 은 메모리 오류를 분석하는 이점이 있습니다.

관련 문제