2016-10-26 8 views
2

코드 : 결과Microsoft.Diagnostics.Runtime을 사용하여 StackTrace에서 메서드에 대한 정보를 얻으려면 어떻게해야합니까?

using System.Diagnostics; 
using System.Linq; 
using Microsoft.Diagnostics.Runtime; 
using Microsoft.Diagnostics.Runtime.Utilities; 
using Microsoft.Diagnostics.Runtime.Utilities.Pdb; 

namespace myDiagnostics 
{ 
    public class myStackTraceInfo 
    { 
     public void Atach() 
     { 
      using (DataTarget target = DataTarget.AttachToProcess(Process.GetCurrentProcess().Id, 5000, AttachFlag.Passive)) 
      { 
       ClrRuntime runtime = target.ClrVersions.First().CreateRuntime(); 
       foreach (ClrThread thread in runtime.Threads) 
       { 
        foreach (ClrStackFrame frame in thread.StackTrace) 
         Console.Write(frame.Method.ToString()); 
       } 
      } 
     } 
    } 
} 

, 내가 대신 메소드 이름의 수 - "UNKNOWN"를. 하지만 in 메서드는 "InstructionPointer"필드입니다. 자세한 정보를 제공 할 수 있습니까?

+0

이는 ClrMD의 유효한 사용법이 아닙니다. 고정 된 프로세스 대신 자신의 스레드를보고 있습니다. 미니 덤프 나 디버거 중단 점에서 얻을 수있는 것처럼. 자신의 스레드가 코드를 실행 중일 때 스택이 계속 변경됩니다. thread.StackTrace를 사용하는 순간에 코드가 DAC 내에서 실행 중일 수 있습니다. 네이티브 C++ 코드는 알 수 없습니다. –

+0

다른 프로세스를 실행하면 동일한 결과가 나타납니다. –

+0

https://github.com/dudikeleti/DumpMiner –

답변

1

UNKNOWN은 메서드에 연결된 관리되는 메서드가 없음을 나타냅니다. 다른 프로세스에 연결해 보거나 모든 스택의 모든 프레임을 따라 가면서 뭔가 찾을 수있을 것입니다.

Here 스택 개체를 포함한 스택 덤프의 예를 찾을 수 있습니다.

Example of dump stack

+0

1. 응용 프로그램 내부에서 StackTrace 재래식 메서드를 살펴보면 유사한 집합이지만 메서드 이름을 볼 수 있습니다. 그래서 Mirosrosoft.Diagnostiсs.Runtime을 사용하여 모든 스트림에 사용할 수있는 방법을 찾기 시작했습니다. 이들 라인 2. I 이러한 방법을 일으킬 유형 \t 경우 (runtime.ReadPointer (frame.StackPointer 아웃 OBJ)) { ClrType 타입 = heap.GetObjectType (OBJ)의 클래스를 발견 ... } 프레임이 thread.StackTrace에서 하나의 프레임입니다. –

+0

올바르게 이해하면이 클래스의 메서드 중 하나가 스택에 있습니다. 그것들 중 어느 것을 결정할 것인가. –

+0

@ Евгений 귀하의 의견을 이해할 수 있는지 잘 모르겠습니다. 그것은 효과가 있습니까? 코드를 확인 했습니까? 그림은 실행중인 WPF 응용 프로그램에서 덤프 한 임의 스택입니다 (프로세스에 연결). 당신이 볼 수있는 것은 특정 스택에있는 메소드의 목록이며, 확장자는 해당 메소드에있는 객체 (및 그 값)를 보여줍니다. –