문제

여러분, C ++로 제작되고 Linux X86_64에서 작동하는 생산 멀티 스레드 서버에서 메모리 손상을 발견하기위한 도구를 추천 해 주시겠습니까? 현재 다음과 같은 문제에 직면 해 있습니다. 몇 시간마다 서버가 segfault와 충돌하고 코어 덤프는 Malloc/Calloc에서 오류가 발생하는 것으로 나타났습니다.

실제로 나는 이미 많은 운이없는 도구를 시도했습니다. 지금까지 내 경험은 다음과 같습니다.

  • Valgrind는 훌륭한 도구이지만 서버가 너무 느려져 생산에서는 사용할 수 없습니다. Stage Server에서 시도해 보았고 실제로 메모리 관련 문제를 찾는 데 도움이되었지만 수정 한 후에도 여전히 프로덕션 서버에서 충돌이 발생합니다. Valgrind에서 몇 시간 동안 무대 서버를 운영했지만 여전히 심각한 오류를 발견 할 수 없었습니다.

  • Electricfence는 실제 메모리 돼지라고합니다. 그러나 제대로 작동하지도 않았습니다. Valgrind가 전혀 문제를 보여주지 않은 임의의 이상한 장소에서 Stage Server에서 거의 즉시 발생합니다. 아마도 Electricfence가 스레딩을 잘 지원하지 않습니까? .. 나는 전혀 모른다.

  • DUMA- 전기 펜스와 같은 이야기이지만 더 나쁩니다. EF가 읽을 수있는 등산으로 코어 덤프를 생성했지만 Duma는 "????"(그리고 예 서버는 -g 플래그로 제작되었습니다)

  • DMALLOC- 표준 malloc 루틴 대신 서버를 사용하도록 서버를 구성했지만 몇 분 후에 매달려 있습니다. 프로세스에 GDB를 첨부하면 Dmalloc 어딘가에 매달린 것으로 나타났습니다.

나는 점차적으로 미쳤고 다음에 무엇을 해야할지 모른다. MTRACE, MPATROL이지만 누군가가 더 나은 아이디어를 가지고 있습니까?

이 문제에 대한 도움을 주셔서 감사합니다.

업데이트: 나는 버그의 소스를 찾을 수있었습니다. 그러나 Helgrind/DRD/TSAN을 사용하여 생산이 아닌 단계 서버에서 발견했습니다. 여러 스레드 사이에 데이터가 있었으며 메모리 손상이 발생했습니다. 열쇠는이 도구가 너무 많은 오 탐지를 보여 주었기 때문에 적절한 Valgrind 억제를 사용하는 것이 었습니다. 그래도 나는 이것이 크게 둔화없이 생산 서버에서 어떻게 발견 될 수 있는지 모르겠다 ...

도움이 되었습니까?

해결책 3

여러분, 나는 버그의 출처를 찾을 수있었습니다. 그러나 Helgrind/DRD/TSAN을 사용하여 Stage Server에서 발견했습니다. 여러 스레드 사이에 데이터가있어 메모리 손상이 발생했습니다. 열쇠는 사용하는 것이 었습니다 적절한 Valgrind 억제 이러한 도구는 너무 많은 오 탐지를 보여 주었기 때문입니다. 그래도 나는 이것이 크게 둔화없이 생산 서버에서 어떻게 발견 될 수 있는지 모르겠다 ...

다른 팁

예, C/C ++ 메모리 손상 문제는 어렵습니다. 나는 또한 Valgrind를 여러 번 사용했는데 때로는 문제가 드러났고 때로는 그렇지 않은 경우도있었습니다.

Valgrind 출력을 검사하는 동안 결과를 너무 빨리 무시하는 경향이 없습니다. 때로는 상당한 시간을 보낸 후에는 Valgrind가 당신에게 처음에 단서를 준 것을 볼 수 있지만, 당신은 그것을 무시했습니다.

또 다른 조언은 이전에 알려진 안정적인 릴리스에서 코드 변경을 비교하는 것입니다. 일종의 소스 버전화 시스템 (예 : SVN)을 사용하는 경우 문제가되지 않습니다. 모든 메모리 관련 기능 (예 : memcpy, memset, sprintf, new, delete/delete [])을 검사합니다.

GCC 4.1 및 -fstack-protector-all 스위치로 프로그램을 컴파일하십시오. 스택을 깎아서 메모리 손상이 발생하면이를 감지 할 수 있어야합니다. SSP의 추가 매개 변수 중 일부를 사용해야 할 수도 있습니다.

당신은 시도 했습니까? -fmudflap? (몇 줄을 스크롤하여 사용 가능한 옵션을보십시오).

당신은 IBM Purify를 시도 할 수 있지만, 나는 그것이 OpenSource가 아닌 것을 두려워합니다 ..

Google Perftools --- 오픈 소스 --- 도움이 될 수 있습니다. 힙 체커 선적 서류 비치.

이거 한번 해봐:http://www.hexco.de/rmdebug/나는 그것을 광범위하게 사용했고, 성능에 영향이 적습니다 (주로 RAM의 양에 영향을 미칩니다). 할당 알고리즘은 동일합니다. 할당 버그를 찾을 수있을만큼 항상 입증되었습니다. 버그가 발생하자마자 프로그램이 충돌하며 자세한 로그가 있습니다.

그것이 당신의 특정 버그를 잡았는지 확실하지 않지만 MALLOC_CHECK_ 환경 변수 (malloc 남자 페이지) 기본 Linux에서 추가 확인을 켜십시오 malloc 구현, 일반적으로 런타임 비용이 크지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top