C#擷取當前堆棧的各調用方法列表

來源:互聯網
上載者:User

標籤:

在使用.NET編寫的代碼在debug時很容易進行排查和定位問題,一旦項目上線並出現問題的話那麼只能依靠系統日誌來進行問題排查和定位,但當項目複雜時,即各種方法間相互調用將導致要擷取具體的出錯方法或調用者將是一件不那麼容易的事(因為沒有PDB檔案)還好.NET提供了一系列系統組件來協助我們擷取項目堆棧資訊用於定位和排查,以下代碼將返回出錯堆棧調用的各上一級方法,直到最終的調用者方法
/****************************************************************** * 建立人:HTL * 建立時間:2015-06-03 19:54:49 * 說明: 擷取出錯時的堆棧調用方法列表 * [email protected] *******************************************************************/using System; public class StackTraceTest{    public static void Main()    {        m1();    }    static void m1(){        m2();    }     static void m2(){        m3();    }     static void m3(){        ResponseWrite();    }    static void ResponseWrite(){        ResponseWriteError();    }    static void ResponseWriteError(){        //將錯誤資訊寫入日誌        Console.WriteLine(GetStackTraceModelName());            }    /// <summary>    /// @Author:      HTL    /// @Email:       [email protected]    /// @DateTime:    2015-06-03 19:54:49    /// @Description: 擷取當前堆棧的上級調用方法列表,直到最終調用者,只會返回調用的各方法,而不會返回具體的出錯行數,可參考:微軟真是個十足的混蛋啊!讓我們跟蹤Exception到行把!(不明真相群眾請入)     /// </summary>    /// <returns></returns>    static string GetStackTraceModelName()    {        //當前堆棧資訊        System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();        System.Diagnostics.StackFrame[] sfs = st.GetFrames();        //過慮的方法名稱,以下方法將不會出現在返回的方法調用列表中        string _filterdName = "ResponseWrite,ResponseWriteError,";        string _fullName = string.Empty, _methodName = string.Empty;        for (int i = 1; i < sfs.Length; ++i)        {            //非使用者代碼,系統方法及後面的都是系統調用,不擷取使用者代碼調用結束            if (System.Diagnostics.StackFrame.OFFSET_UNKNOWN == sfs[i].GetILOffset()) break;            _methodName = sfs[i].GetMethod().Name;//方法名稱            //sfs[i].GetFileLineNumber();//沒有PDB檔案的情況下將始終返回0            if (_filterdName.Contains(_methodName)) continue;            _fullName = _methodName + "()->" + _fullName;        }        st = null;        sfs = null;        _filterdName = _methodName = null;        return _fullName.TrimEnd(‘-‘,‘>‘);    }}

 

 執行以上代碼效果(跟代碼中的調用方法一致):  參考:線上代碼:http://ideone.com/34Q3Sk 部落格園:如何處理Windows Forms程式中未處理的異常 
微軟真是個十足的混蛋啊!讓我們跟蹤Exception到行把!(不明真相群眾請入) 挖一挖C#中那些我們不常用的東西之系列(3)——StackTrace,Trim 
淺析StackTrace
 MSDN StackTrace 類
 



來自為知筆記(Wiz)



C#擷取當前堆棧的各調用方法列表

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.