.NET使用StackTrace獲取方法調(diào)用信息的代碼演示
前言
在日常工作中,偶爾需要調(diào)查一些詭異的問題,而業(yè)務(wù)代碼經(jīng)過長時(shí)間的演化,很可能已經(jīng)變得錯(cuò)綜復(fù)雜,流程、分支眾多,如果能在關(guān)鍵方法的日志里添加上調(diào)用者的信息,將對(duì)定位問題非常有幫助。
介紹
StackTrace
, 位于 System.Diagnostics
命名空間下,名字很直觀,它代表一個(gè)方法調(diào)用的跟蹤堆棧,里面存放著按順序排列的棧幀對(duì)象(StackFrame
),每當(dāng)發(fā)生一次調(diào)用,就會(huì)壓入一個(gè)棧幀;而一個(gè)棧幀,則擁有本次調(diào)用的各種信息,除了MethodBase,還包括所在的文件名、行、列等。
演示
下面代碼演示了如何獲取調(diào)用者的方法名、所在文件、行號(hào)、列號(hào)等信息。
public static string GetCaller() { StackTrace st = new StackTrace(skipFrames: 1, fNeedFileInfo: true); StackFrame[] sfArray = st.GetFrames(); return string.Join(" -> ", sfArray.Select(r => $"{r.GetMethod().Name} in {r.GetFileName()} line:{r.GetFileLineNumber()} column:{r.GetFileColumnNumber()}")); }
第一幀是 GetCaller
本身,所以跳過;fNeedFileInfo
設(shè)置成 true
,否則調(diào)用者所在文件等信息會(huì)為空。
簡單創(chuàng)建個(gè)控制臺(tái)程序并添加幾個(gè)類模擬一下,輸出如下:
UpdateOrder in G:\examples\MethodCall2\ClassLevel6.cs line:11 column:8 ->
Level5Method in G:\examples\MethodCall2\ClassLevel5.cs line:8 column:9 ->
Level4Method in G:\examples\MethodCall2\ClassLevel4.cs line:10 column:9 ->
Level3Method in G:\examples\MethodCall2\ClassLevel3.cs line:10 column:9 ->
Level2Method in G:\examples\MethodCall2\ClassLevel2.cs line:10 column:9 ->
InternalMethod in G:\examples\MethodCall2\ClassLevel1.cs line:12 column:13 ->
Main in G:\examples\MethodCall2\Program.cs line:18 column:17
可以看到因?yàn)?code>StackTrace是個(gè)棧結(jié)構(gòu)(FILO),所以打印出來的順序也是由近及遠(yuǎn)的。
鏈接
StackTrace Class https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stacktrace?view=net-6.0
StackFrame Class https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stackframe?view=net-6.0
到此這篇關(guān)于.NET使用StackTrace獲取方法調(diào)用信息的文章就介紹到這了,更多相關(guān).NET方法調(diào)用信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解ASP.NET Core應(yīng)用中如何記錄和查看日志
本篇文章主要介紹了ASP.NET Core應(yīng)用中如何記錄和查看日志,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12asp.C#實(shí)現(xiàn)圖片文件與base64string編碼解碼
前些天在opera論壇里面當(dāng)了個(gè)flashblocker腳本文件,顧名思義,就是把網(wǎng)頁中的flash給過濾了,過濾之后呢就會(huì)在原位置顯示一張圖片,以前用firefox時(shí)的flash過濾插件也是這樣,而且顯示的圖片也一樣,一樣的難看,于是就想換換它。2010-03-03asp.net頁面與頁面之間傳參數(shù)值方法(post傳值和get傳值)
這篇文章主要介紹了asp.net頁面與頁面之間傳參數(shù)值方法,說明了post傳值和get傳值的使用方法,需要的朋友可以參考下2014-02-02