2011-08-31 3 views
1

CRT가 발생했습니다 C# Windows 서비스 응용 프로그램에서 힙 손상으로 인해 메시지 상자가 발견되었습니다. 힙 손상 원본을 찾을 수 없으며 릴리스 모드에서 컴파일해도 메시지 상자가 계속 나타납니다. 힙 손상은 아마도 내 서비스에서 사용하는 관리되지 않는 DLL 파일 중 하나에 있습니다 (그러나 어디에서 알 수 없습니다).관리 서비스에서 CRT 디버그 힙 손상이 발견되었습니다.

  1. 어떻게 문제의 원인을 찾을 수 있습니까?
  2. 어떻게 메시지 상자를 비활성화 할 수 있습니까?
+0

일부 유용한 유용한 정보는 [힙 손상 오류를 디버깅하는 방법?] (http://stackoverflow.com/questions/1010106/how-to-debug-heap-corruption-errors)을 참조하십시오. – Justin

답변

0

오류는 네이티브 DLL에서 왔으며 잘못되었거나 잘못 사용되었습니다. 어떤 것을 찾으려면 Process Explorer을 사용하여 메시지가 팝되었을 때 앱 스레드의 스택 추적을 검사 할 수 있습니다. DLL은 스택 맨 위에 있습니다 (메시지 상자 항목은 스택 위에 있습니다). 오류의 근원은 메모리가 해제 될 때 감지됩니다.

one of these options을 사용하여 메시지를 비활성화 할 수는 있지만 문제는 숨길 수 있습니다. 힙이 손상되면 데이터가 손상 될 수도 있습니다.

BTW, AFAIK, 이러한 메시지는 디버그 빌드에만 표시됩니다. 즉, 기본 DLL이 디버그 빌드에 있음을 의미합니다. 그것이 제 3 자의 것이라면 이상 할 것입니다. 그것이 당신이라면, 프로세스에 디버거를 붙이면됩니다. 메시지가 갑자기 나타나면 깨질 것입니다. 여전히 오류의 근본 원인은 없지만 컨텍스트에 대한 더 나은 그림을 볼 수 있습니다.

+0

"힙이 손상되면 "데이터가 손상 될 수도 있습니다."제 경험으로 볼 때 힙 손상은 거의 항상 매우 빠르게 (il-) 로직이 쏟아져 나오는 프로그램으로 이어집니다. 힙 손상보다 나쁜 것은 스택 손상 (또는 손상된 코드이지만 훨씬 드물다)입니다. –

+0

@Donal, 일반적으로 이런 일이 발생할 때 자신이 운명이라고 생각할 수 있습니다. 실제로 디버그 힙은 이러한 문제를 감지하기 위해 블록 전후에 여분의 바이트를 사용하기 때문에 오버런이 사소한 경우이를 제거 할 수 있습니다. 그런 다음 릴리스 빌드에서 오류없이 데이터를 잃어 버리게됩니다. 고객의 사이트). 그것이 왜 DLL이 디버그 빌드에 있는지 궁금해 ... – eran

1

Gflags.exePageheap.exe으로 프로그램을 실행하십시오. 이렇게하면 부패가 발생하는 곳을 트랩하는 데 도움이됩니다.

관련 문제