2013-10-07 4 views
3

고객의 미니 덤프가 있습니다. 로드 된 .NET dll의 어셈블리 버전을 찾고 싶습니다. 나는 이미 몇 시간 동안 인터넷을 검색했지만 사용 가능한 방법을 찾을 수 없습니다. 나는 windbg하고 SOS 확장을로드했습니다. clr.dll과 mscordacwks가 필요합니다.windbg에서 관리되는 dll의 버전을 어떻게 식별 할 수 있습니까?

lm -v을 사용하면 관리되지 않는 dll 만 표시됩니다. 나는 아주 단순한 것을 간과 할 것이라고 확신한다.

+1

그것은 조립, 버전 자원의 관리되지 않는 리소스에 포함된다. "미니 덤프 (minidump)"의 미니는 일반적으로 시스템에 설치하지 못하게하므로 미니 덤프는 관리되는 코드와 잘 작동하도록 설계되지 않았습니다. GC 힙 전체를 포함시키지 않는 것이 또 다른 전형적인 장애물입니다. 고객에게 사본을 요청하거나 도움말 + 정보 대화 상자를 다시 읽으십시오. –

+1

미니 덤프라는 용어는 다소 불행합니다. 주어진 옵션에 따라 전체 덤프보다 더 완전 할 수 있습니다. 일반적으로 관리 응용 프로그램/ma가 이상적입니다. 덤프 유형을 || 명령. – Dono

+0

유형이 "사용자 미니 덤프"로 표시됩니다. – Nimeroth

답변

6

좋아, 좀 더 조사한 결과, 그 종류의 정보는 단지 미니 dump에있는 dll에서 사용할 수 없다는 결론에 도달했습니다. 어쨌든 필자는 적어도 파일에 대한 정보를 좀 더 얻을 수 있었고 나중에 다른 사람에게 유용 할 수도 있습니다.

적어도 dll의 메타 정보를 얻을 수 있으며 거기에서 유용한 정보를 찾을 수 있습니다.

먼저 도메인을 얻을 : 여기 그렇게하는 방법 당신은 나와 어셈블리의 많은 양으로 끝낼 수 있습니다

!dumpdomain 

. 그것은 어쩌면 아니다 (windbg를 (http://pykd.codeplex.com/)에 대한 파이썬 확장을 설치하고 빠른 간과 위해 다음 스크립트를 사용

!dumpassembly ADDRESS 

을 아니면 그냥 게으른 방법을 사용할 수 있습니다 : 지금 당신은 사용하여 손으로 그들을 볼 수 있습니다 좋은 스크립트,하지만 작동하고 내가) 더 많은 시간을 투자하고 싶지 않았다 :

import pykd 

def dump_assemblies(): 
    assemblies = 0 

    addrs = pykd.dbgCommand("!dumpdomain").splitlines() 
    for x in addrs: 
     if x[:8] == "Assembly": 
      assemblies = assemblies + 1 
      print "### retrieving assembly " + x[-8:] 
      print pykd.dbgCommand("!dumpassembly " + x[-8:]) 
    print "### found " + str(assemblies) + " assemblies." 

dump_assemblies() 

은 이제 DLL에 대한 텍스트 검색 (CTRL + F)를 할 수있을 것입니다. 찾으면 모듈 이름 옆에 오프셋을 찾을 수 있습니다 (12327C8 C : \ Program Files \ MyApp \ MyDLL.dll과 비슷한 모양).

이제 사용하여 모듈을 덤프 할 수 있습니다

!dumpmodule 12327C8 

당신을 이끌 것이다 :

dc 1c1aaa4c 1c1aaa4c + 4248 
: 이제

Name:  C:\Program Files\MyApp\MyDLL.dll 
Attributes: PEFile 
Assembly: 131a22e2 
LoaderHeap:    00000000 
TypeDefToMethodTableMap: 19220010 
TypeRefToMethodTableMap: 134303e0 
MethodDefToDescMap:  13430740 
FieldDefToDescMap:  13433964 
MemberRefToDescMap:  134350c8 
FileReferencesMap:  13435918 
AssemblyReferencesMap: 1343591c 
MetaData start address: 1c1aaa4c (4248 bytes) 

당신이 단순히 DLL의 메타 데이터를 확인하실 수 있습니다

그게 내가 DLL에 대한 자세한 정보를 얻을 수있는 가장 가까운 곳이야. 불행히도 파일 버전은 거기에 쓰여지지 않았으며, 좀 더 일반적인 정보를 담고 있습니다. 어쨌든, 나는 고객과 다시 연락하려고 노력할 것이다. 어쨌든 답변 주셔서 감사합니다.

3

WinDbg의 lm v은 관리되는 DLL과 관리되지 않는 DLL을 모두 보여줍니다. 그 수준에서 어셈블리는 단지 DLL 일 뿐이며 단지 모듈 일뿐입니다.

0:008> lmv m MyApp 
start end  module name 
10310000 10574000 MyApp(deferred)    
    Image path: C:\...\MyApp.exe 
    Image name: MyApp.exe 
    Has CLR image header, track-debug-data flag not set 
    Timestamp:  Wed May 21 16:34:02 2014 (537CB95A) 
... 
    ProductVersion: 1.8.0.44 
    FileVersion:  1.8.0.44 
... 

그러나 상기의 FileVersion 및 PRODUCTVERSION 아직 DLL의 기본 자원 부분으로 컴파일되지 않는 정보이다 WinDbg는 6.3.9600 함께

lm v 심지어 모듈 여부 정보는 CLR 헤더 아닌지를 가지고 도시 .

!SaveModule <start address> <filename>을 사용하여 디스크에 파일을 저장 한 다음 dotPeek과 같은 리플렉션 도구를 사용하여 파일을 열고 이름, 버전, 문화권 및 공개 키 토큰을 제공하는 어셈블리 정보를 가져 오는 것이 좋습니다.

이 같은 Naveenwritten a script, 모든 모듈을 저장하려면 :

!for_each_module .if ($spat ("${@#ImageName}","*.exe")) { !SaveModule ${@#Base} c:\temp\${@#ModuleName}.exe } .else { !SaveModule ${@#Base} c:\temp\${@#ModuleName}.dll } 
+1

매력처럼 작동합니다. 이것은 하나 이상의 투표가 필요한 곳입니다! – bentayloruk