2014-09-11 3 views
3

네이티브 메모리 누수가있는 경우 관리되는 프로세스 메모리 덤프를 용의자로 분석하려고합니다. windbg을 사용할 수 있으려면 (서버에서 힙 확장을 사용) 서버 프로세스에 대한 사용자 모드 호출 스택을 활성화했습니다.Windows 힙 할당 스택 호출 - 이상한 콜 스택

많은 크기의 블록을 볼 수 있습니다. 수동으로을 -a -p ! 힙을 사용하여 확인) 형태

!heap -p -a 000000003ca5cfd0 
    address 000000003ca5cfd0 found in 
    _HEAP @ 1ea0000 
       HEAP_ENTRY Size Prev Flags   UserPtr UserSize - state 
     000000003ca5cfa0 0009 0000 [00] 000000003ca5cfd0 00068 - (busy) 
     7766bbed ntdll! ?? ::FNODOBFM::`string'+0x000000000001913b 
     7fef7b76a57 msvcr120!malloc+0x000000000000005b 
     7fef7b76967 msvcr120!operator new+0x000000000000001f 
     7fe9a5cdaf8 +0x000007fe9a5cdaf8 

많은 콜 스택이 있습니다 당신은 그들이 내 덤프 파일에 MB의 수백을 가지고 있기 때문에 이러한 할당을 무엇인지 어떤 생각을 가지고 있습니까?

편집 LM은 내가 (NGEN 사용) 응용 프로그램에 생성 된 네이티브 이미지가 없다고 가정

start    end    module name 
00000000`773b0000 00000000`774cf000 kernel32 (pdb symbols) 
00000000`774d0000 00000000`775ca000 user32  (deferred) 
00000000`775d0000 00000000`77779000 ntdll  (pdb symbols) 
00000000`77790000 00000000`77797000 psapi  (deferred) 
00000000`777a0000 00000000`777a3000 normaliz (deferred) 
00000001`3f810000 00000001`3f818000 ManagedService (deferred)    
000007fe`dd2d0000 000007fe`de398000 System_Web_ni (deferred) 
+1

'7fe9a5cdaf8'주위의 모든 모듈에 대한 기호가 누락되었습니다. 'lm'을 실행하고 그 주소가 대응하는 모듈을 찾아 심볼을 찾을 수 없는지 확인하십시오. –

+0

@PatrickQuirk ManagedService와 System_Web_ni 사이의 영역에는 매핑 된 모듈이 없습니다. – Ghita

+1

이 경우 동적 코드 일 수 있습니다. 다음 단계가 68 바이트가 할당 될 때 [중단 점]을 추가하는 것 이외의 다른 항목이 될지 확실하지 않습니다. (http://codediary.wordpress.com/2010/03/29/4/) 스택 추적. –

답변

2

7fe9a5cdaf8 (절단) 지역의 주위에 다음 보여줍니다. 이 경우 모듈 (DLL)은 실행되지 않을 IL 코드 만 포함합니다. 따라서 네이티브 관점에서 모듈 내부를 가리키는 스택이 없습니다.

대신 IL 코드는 JIT가 메모리의 다른 위치로 컴파일됩니다. 7fe9a5cdaf8 귀하의 경우. 이것이 실제 코드가 실행되는 곳입니다. 그래서 네이티브 측에서 볼 수 있습니다.

다음을 수행 닷넷 방법의 설명에 JIT 컴파일 명령을 되돌리려면 :

0:000> .symfix 
0:000> .loadby sos mscorwks ; *** .NET 2 
0:000> .loadby sos clr ; *** .NET 4 

0:000> !ip2md 7fe9a5cdaf8 

내가 덤프를 가지고 있지 않기 때문에 다음, 여기에 예는 .NET 메소드 이름을 (표시해야합니다 출력) :

MethodDesc: 000007ff00033450 
Method Name: ManagedService.Program.Main() 
Class: 000007ff00162438 
MethodTable: 000007ff00033460 
mdToken: 0600001f 
Module: 000007ff00032e30 
IsJitted: yes 
CodeAddr: 000007ff00170120 
+0

귀하의 sugestion 주셔서 감사합니다. 결국 68 바이트 할당을위한 라이브 프로세스에서 중단 점을 설정해야하며! ip2md 명령어를 사용하여 여러 호출 스택 프레임을 "디코딩"해야한다는 점이 신기하게도 필요했습니다. 이 코드는 C++ CLI로 누설되는 일부 원시 메모리를 할당합니다. 나는 다른 곳에서이 ip2md에 대해 더 많이 알 수 있는지 궁금해. – Ghita