日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C#获取当前堆栈的各调用方法列表

發(fā)布時(shí)間:2025/3/17 C# 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#获取当前堆栈的各调用方法列表 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在使用.NET編寫的代碼在debug時(shí)很容易進(jìn)行排查和定位問(wèn)題,一旦項(xiàng)目上線并出現(xiàn)問(wèn)題的話那么只能依靠系統(tǒng)日志來(lái)進(jìn)行問(wèn)題排查和定位,但當(dāng)項(xiàng)目復(fù)雜時(shí),即各種方法間相互調(diào)用將導(dǎo)致要獲取具體的出錯(cuò)方法或調(diào)用者將是一件不那么容易的事(因?yàn)闆](méi)有PDB文件) 還好.NET提供了一系列系統(tǒng)組件來(lái)幫助我們獲取項(xiàng)目堆棧信息用于定位和排查,以下代碼將返回出錯(cuò)堆棧調(diào)用的各上一級(jí)方法,直到最終的調(diào)用者方法 /******************************************************************* 創(chuàng)建人:HTL* 創(chuàng)建時(shí)間:2015-06-03 19:54:49* 說(shuō)明: 獲取出錯(cuò)時(shí)的堆棧調(diào)用方法列表* Huangyuan413026@163.com*******************************************************************/ 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(){//將錯(cuò)誤信息寫入日志 Console.WriteLine(GetStackTraceModelName()); }/// <summary>/// @Author: HTL/// @Email: Huangyuan413026@163.com/// @DateTime: 2015-06-03 19:54:49/// @Description: 獲取當(dāng)前堆棧的上級(jí)調(diào)用方法列表,直到最終調(diào)用者,只會(huì)返回調(diào)用的各方法,而不會(huì)返回具體的出錯(cuò)行數(shù),可參考:微軟真是個(gè)十足的混蛋啊!讓我們跟蹤Exception到行把!(不明真相群眾請(qǐng)入) /// </summary>/// <returns></returns>static string GetStackTraceModelName(){//當(dāng)前堆棧信息System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();System.Diagnostics.StackFrame[] sfs = st.GetFrames();//過(guò)慮的方法名稱,以下方法將不會(huì)出現(xiàn)在返回的方法調(diào)用列表中string _filterdName = "ResponseWrite,ResponseWriteError,";string _fullName = string.Empty, _methodName = string.Empty;for (int i = 1; i < sfs.Length; ++i){//非用戶代碼,系統(tǒng)方法及后面的都是系統(tǒng)調(diào)用,不獲取用戶代碼調(diào)用結(jié)束if (System.Diagnostics.StackFrame.OFFSET_UNKNOWN == sfs[i].GetILOffset()) break;_methodName = sfs[i].GetMethod().Name;//方法名稱//sfs[i].GetFileLineNumber();//沒(méi)有PDB文件的情況下將始終返回0if (_filterdName.Contains(_methodName)) continue;_fullName = _methodName + "()->" + _fullName;}st = null;sfs = null;_filterdName = _methodName = null;return _fullName.TrimEnd('-','>');} }

?

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



來(lái)自為知筆記(Wiz)



總結(jié)

以上是生活随笔為你收集整理的C#获取当前堆栈的各调用方法列表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。