2010-07-03 4 views
2

*** glibc는 감지 *** (/ 내/프로그램/...)의 malloc() : 메모리 손상 : 나는 Valgrind의에서 실행 한메모리 손상이 잘못된 * 읽기 * 해제 된 메모리로 인해 발생할 수 있습니까? 내가 <p></p>납니다

0xf28000fa *** ,보고 된 사례를보고 해제 된 메모리,하지만 불법적 인 메모리의 경우는 씁니다.

메모리를 읽으면 메모리가 손상 될 수 있습니까? 그렇지 않다면 valgrind 출력을 넘어서는 다른 제안은 무엇입니까?

답변

5

이처럼,이 메모리 주소의 각 쓰기를 볼 GDB를 사용할 수 있습니다 어디에 문제가

(gdb) watch *((int*)0xf28000fa) 

그런 다음 당신이 디버깅 할 수 있습니다.

읽기가 메모리 손상을 일으키지는 않지만, 그 원인이 될 수 있다고 상상할 수없는 많은 상황이 있으며 Valgrind는 완벽한 도구가 아닙니다.

메모리 문제 디버그에 대한 자세한 정보는 here을 참조하십시오.

+0

감사합니다. 이것은 매우 유용한 정보입니다. –

2

읽은 메모리가 손상되지는 않지만 프로그램 작업에 이상한 일은 없을 것입니다.

1

아니요, 잘못된 위치를 읽으면 표시되는 오류가 발생할 수 없습니다. 위치가 주소 공간에서 유효하면 정크 메일 만 읽으면됩니다. 그렇지 않으면 세그먼트 오류가 발생합니다.

잘못된 읽기가 어디서 왔는지 확인하려면 valgrind의 출력을 확인하십시오. 그러면 실제 실수가 어디로 향하는 지 알 수 있습니다. 일단 당신이 이것을 발견하면, 나는 진짜 범인이 멀지 않을 것이라는 것을 확신하고, 아마도 잘못된 글 일 것입니다.

+0

하지만 잘못된 쓰기가있는 경우 왜 valgrind도 그렇게 표시하지 않습니까? –

+0

그건 내가 그 해답을 모른다는 것입니다. 그러나 무효 한 것을 일으키는 것을 보았습니까? – casablanca

+0

@steve : 하나의 가능성은 valgrind에 의해 보호 받는다는 의미에서 * invalid *가 아닌 주소를 사용하는 코드의 일부가 불법 읽기가되지만 주소가 아니라는 점에서 잘못된 것입니다 그 코드가 사용해야합니다. 이것은 차례가되면 메모리 손상으로 인해 불일치가 발생할 수 있습니다. 부패가 반드시 감지 할 수없는 무효 쓰기가 발생했다는 것을 의미하는 것은 아니며 단지 일부 데이터 구조가 일관성이 없다는 것을 의미합니다. 간단한 가상의 예로서 목록 노드를 목록에 두 번 추가하는 것을 상상해보십시오 - 불법 쓰기를 수행하지는 않지만 손상된 목록을 가져옵니다. –

1

현재 프로세서에서 공통적이지 않아야하지만, 읽기 작업조차도 마술을 할 수있는 플랫폼에서 작업했습니다. 특정 6502 프로세서에는 I/O가 매핑되어 있으므로 I/O 매핑 된 주소가있는 일반 "읽기"명령어는 놀라운 작업을 수행 할 수 있습니다.

약 30 년 전에 나의 나쁜 읽기가 메모리 뱅크 스위치 (코드를 포함하는 영역을 포함하여 메모리의 모든 바이트가 그 명령어 바로 다음에 새로운 값을 가짐)를 유발했기 때문에 나는 그것에 물렸다. 재미있는 부분은 실제로 "의도하지 않은"나쁜 읽기가 아니었다는 것입니다 ...이게 제가 몇 가지 어셈블러 지침을 저장했기 때문에 실제로 쓰레기가 될 것이라는 것을 알고 있더라도 읽었습니다 ... 똑똑한 움직임이 아닙니다. .

0

자유롭게 madvise (MADV_DONTNEED) syscall을 사용하여 커널에 "이 페이지가 필요하지 않습니다."라고 말할 수 있습니다 (madvise (2) 맨 페이지 참조). 그 페이지가 정말로 할당이 해제되고 그 페이지에서 아무 것도 읽지 않으면 커널은 새 페이지를 자동으로 제공하고 0으로 만들어 응용 프로그램이 완전히 예상치 못한 데이터를 만날 수있게합니다!

관련 문제