2010-06-23 3 views
22

gdb에서 백 트레이스를 볼 때 내 응용 프로그램은 때때로 segfaults가되고 주로 malloc() 및 malloc_consolidate()에 있습니다.malloc() 및 malloc_consolidate()의 Segfaults

컴퓨터의 메모리가 충분한 지 확인하고 스와핑을 시작하지 않았습니다. 데이터 분할 및 최대 메모리 크기에 대해 ulimits를 확인했으며 둘 다 '무제한'으로 설정되었습니다. 또한 valgrind에서 응용 프로그램을 실행했는데 메모리 오류를 찾지 못했습니다.

이제 이러한 세그 폴트를 일으킬 수있는 다른 아이디어가 있습니다. 어떤 아이디어?

업데이트 : 이후 가 다른 응용 프로그램의 libc의 메모리 구조를 부수고 또는 각 프로세스에 대해 별도의 구조가 있음이 될 수 Valgrind의 (또는 ptrcheck) 아무것도를 찾는 아니에요?

+2

valgrind에서 충돌 했습니까? –

+0

아니요, 충돌하지 않았습니다. 그것의 실시간 응용 프로그램과 valgrind 내가 단지 그것에 매우 가벼운 하중을 넣을 수 있고 일반적으로 더 무거운 하중 아래 충돌합니다. –

+0

어떤 운영 체제입니까? 툴체인의 판단에 따르면, 마치 리눅스처럼 보일 것입니다. 이 경우, 아니오, 다른 응용 프로그램은 힙을 휴지통으로 만들 수 없습니다. 그것은 당신의 어플리케이션에있는 것입니다. 로드하는 동안 만 이런 일이 발생하면 훨씬 더 까다로워집니다 ...로드 상태에서 다른 점은 무엇입니까? 어떻게하면 힙을 휴지통으로 만들 수 있습니까? Valgrind에서 실행되는 동안 가능한 한 최선을 다해 응용 프로그램을 "고문"해보십시오.로드 할 때 존재할 수있는 조건을 어떻게 재현 할 수 있습니까? 어쩌면 메모리를 무상으로 할당 할 수 있을까요? –

답변

12

아마도 힙을 버리는 것입니다. 즉, 할당 한 메모리의 한계를 초과하여 쓰고있는 것일 수 있으며, 이는 malloc()이 힙을 관리하는 데 사용하는 데이터 구조를 덮어 쓰는 것입니다. 이로 인해 malloc()이 잘못된 주소에 액세스하고 응용 프로그램이 충돌합니다.

메모리가 부족하면 malloc()이 충돌하지 않으므로 간단히 NULL을 반환합니다. NULL을 확인하지 않으면 코드가 다운 될 수 있지만 충돌 사이트는 malloc()이 아닙니다.

Valgrind가 오류를보고하지 않는다는 것이 약간 이상합니다. 그러나 기본 "Memcheck"도구가 놓칠 수있는 오류가 있습니다. 대신 "Ptrcheck" tool으로 Valgrid를 실행 해보십시오. http://www.gnu.org/s/libc/manual/html_node/Heap-Consistency-Checking.html#Heap-Consistency-Checking에서

+0

그러나 이것은 valgrind 아래 나타나지 않아야합니까? (내 테스트 적용 범위가 충분하다고 가정하십시오.) –

+1

귀하의 의견이 제 편집과 겹쳐 진 것 같습니다. 제안 된대로, Valgrind를 "Ptrcheck"도구로 실행 해보십시오. malloc()이 충돌하면, 어떤면에서 힙을 버리는 것이 거의 확실합니다. –

+1

Valgrind 릴리스 3.7.0 (2011 년 11 월 5 일)부터 ** exp-ptrcheck ** 도구는 스택 및 전역 배열 오버런에 대해 _check 기능의 이름이 변경되고 축소되었습니다. 이제 ** exp-sgcheck ** ("스택 및 전역 배열 검사")라고합니다. [link] (http://valgrind.org/docs/manual/dist.news.html) – Amar

21

:

또 다른 가능성은 의 malloc, realloc을 사용 버그에 대한 및 가드를 확인하고 무료로 환경 변수 MALLOC_CHECK_를 설정하는 것입니다. MALLOC_CHECK_이 설정되면 동일한 인수를 사용하는 이중 호출 (double calls) 또는 단일 바이트 초과 (off-by-one)의 오버런과 같은 간단한 오류에 대해 허용되도록 설계된 특수한 (덜 효율적인) 구현이 사용됩니다 버그). 그러나 이러한 모든 오류가 에 대해 보호 될 수는 없으며 메모리 누수가 발생할 수 있습니다. MALLOC_CHECK_가 0으로 설정된 경우 검색된 힙 손상은 자동으로 무시됩니다. ; 1로 설정하면 진단이 stderr에 인쇄됩니다. 2로 설정하면 중단이 즉시 호출됩니다. 그렇지 않으면 충돌이 나중에 발생할 수 있고 문제의 진정한 원인은 이므로 추적하기가 매우 어렵 기 때문에 유용 할 수 있습니다.