2010-05-24 3 views
10

valgrind에서 일부 라이브러리 집합을 무시하도록 설정할 수 있습니까? 특히 glibc 라이브러리 ..valgrind에서 glibc 라이브러리를 무시하도록 설정할 수 있습니까?

실제 문제 : 정상적인 실행 상태에서 올바르게 실행되는 코드가 있습니다. 누수가 없음.

valgrind를 통해 실행하려고하면 코어 덤프가 발생하고 프로그램이 다시 시작되고 중지됩니다.

코어는 일반적으로 glibc 기능 (보통 fseek, 뮤텍스 등)을 가리 킵니다. 호환되지 않는 glibc/valgrind 버전에 문제가있을 수 있음을 알고 있습니다.

다양한 valgrind 릴리스와 glibc 버전을 시도했지만 운이 없었습니다. 제안 사항이 있으십니까?

답변

3

예, Valgrind의 suppression system을 살펴보십시오.

+0

valgrind가 특정 glibc 기능을 프로파일 링하지 말고 결과 출력을 억제하지 말고 싶다고 생각합니다. –

+0

@ 팀 : 맞습니다! 기본적으로 나는 valgrind가 그들을 무시하기를 원합니다. (정상적인 실행처럼 실행하십시오.) – Jack

+0

@Jack - 당신은 valgrind 내부를 오히려 잘 알고 있어야합니다. 정말 valgrind/valgrind.h를 살펴 보시기 바랍니다. valgrind에서받은 결과를 게시하지 않는 한 제안하기가 어렵습니다. –

1

Valgrind user's mailing list에 대해 궁금해하고 싶을 것입니다 (매우 유용합니다). 특정 호출의 출력을 억제 할 수는 있지만 잡음을 억제하는 것은 모두 당신이하고있는 일입니다. 전화는 아직 Valgrind를 통과하고 있습니다.

필요한 작업을 수행하려면 Valgrind를 적절하게 glibc 또는과 일치 시키십시오. valgrind/valgrind.h의 매크로를 사용하면 문제를 해결할 수 있습니다. 그것들을 사용해서, 예, 당신은 valgrind에게 어떤 것들을 건드리지 말라고 말할 수 있습니다. 어떤 호출이 모든 것을 보봇 (Borking)하는지 확신 할 수 없지만, valgrind 하에서 실행되는 경우 (선택적으로) 자신의 프로그램에서 약간의 코드를 실행할 수는 없습니다. 매크로는 valgrind/valgrind.h에 있습니다.

다른 점은 Valgrind가 올바르게 deal with threads으로 컴파일되었는지 확인하는 것입니다. Valgrind에서의 원자 적 조작은 racey 작업 중에 충돌을 일으킬 수 있습니다. 제대로 실행되지 않으면 그렇지 않을 수도 있습니다.

valgrind 및 glibc 버전을 스와핑 한 경우 일치하는 항목을 찾을 수 있지만 빌드 할 때 valgrind가 잘못 구성 될 수 있습니다.

4

unwind에서 언급했듯이 valgrind에는 어떤 절차가 계측되고 어떻게 제어되는지에 대한 정교한 메커니즘이 있습니다. 그러나 valgrind와 glibc는 모두 복잡한 짐승이고, 정말로, 정말로, 정말로 이것을하고 싶지 않습니다. 서로 호환되는 glibc와 valgrind를 얻는 쉬운 방법은의 리눅스 배포판에서 모두 을 얻는 것입니다. 상황은 "잘 작동"해야하며 그렇지 않은 경우 불평 할 사람이 있습니다.

6

이것은 아마도 귀하의 질문에 대답하지 않지만, 당신에게 (다른 사람이 언급했지만 구체적으로 설명하지 않은 경우) 특정 오류를 억제하는 방법의 세부 사항을 제공합니다 :

다음과 같이 valgrind을 실행, 첫째 :

valgrind --gen-suppressions=all --log-file=valgrind.out ./a.out 

이제 출력 파일 valgrind.out은 다음과 같이 몇 가지 자동으로 생성 억제 블록이 포함됩니다 :

{ 
    stupid sendmsg bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14687 
    Memcheck:Param 
    sendmsg(mmsg[0].msg_hdr) 
    fun:sendmmsg 
    obj:/usr/lib/libresolv-2.17.so 
    fun:__libc_res_nquery 
    obj:/usr/lib/libresolv-2.17.so 
    fun:__libc_res_nsearch 
    fun:_nss_dns_gethostbyname4_r 
    fun:gaih_inet 
    fun:getaddrinfo 
    fun:get_socket_fd 
    fun:main 
} 

여기서 "stupid sendmsg bug"및 링크는이 블록을 참조하기 위해 추가 한 이름입니다.이제, 다음 실행에 해당 파일에 대해 valgrindsendmsg.supp에 그 블록을 저장하고 말 :

valgrind --log-file=valgrind --suppressions=sendmsg.supp ./a.out 

그리고 valgrind을 기꺼이 바보 업스트림 버그를 무시합니다.

관련 문제