2016-10-26 19 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()); 
       } 
      } 
     } 
    } 
} 

其結果是,我得到的替代方法的名稱 - 「未知」。但是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常規方法,我們可以看到類似的集合,但具有方法的名稱。 因此,我開始尋找方法讓他們使用Miсrosoft.Diagnostiсs.Runtime處理所有流。 2.這些線我發現的一類導致這些方法類型 \t 如果(runtime.ReadPointer(frame.StackPointer,出OBJ)) { ClrType類型= heap.GetObjectType(OBJ); ... } 那麼這個幀就是thread.StackTrace中的一幀 –

+0

如果我理解正確的話,這個類的其中一個方法就是在棧上。它仍然是要確定其中哪一個。 –

+0

@Евгений我不確定我是否理解你的評論。它是工作還是不工作?你有沒有檢查過代碼?該圖片是從運行的WPF應用程序中轉儲的隨機堆棧(附加到進程)。你看到的是特定堆棧上的方法列表,並且擴展器向你展示了該方法中的對象(以及他們的值)。 –

相關問題