解析c#在未出現(xiàn)異常情況下查看當(dāng)前調(diào)用堆棧的解決方法
更新時(shí)間:2013年05月18日 11:49:02 作者:
本篇文章是對(duì)c#在未出現(xiàn)異常情況下查看當(dāng)前調(diào)用堆棧的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
C#查看堆棧通常是在異常處理中,出現(xiàn)異常之后通過(guò)異常的堆棧可以很方便的得到出現(xiàn)這個(gè)錯(cuò)誤的代碼調(diào)用路徑。這個(gè)很有用,是否可以在沒(méi)有異常出現(xiàn)時(shí)使用這種方法排查一些非異常錯(cuò)誤呢?答案是肯定的。
起因:
論壇發(fā)帖子有幾個(gè)途徑,有可能是新聞系統(tǒng)直接導(dǎo)入的帖子,也有可能是抓取的帖子,還有可能是用戶通過(guò)正常途徑發(fā)表。但是這兩天出了一個(gè)問(wèn)題,有些帖子的HasImage屬性不對(duì)。通過(guò)幾種方法做調(diào)試都不能重現(xiàn)問(wèn)題,沒(méi)有辦法,只有在程序中添加回復(fù)的地方添加日志程序來(lái)記錄堆棧,從而追蹤到是哪個(gè)途徑發(fā)帖出現(xiàn)了問(wèn)題。
代碼:
[PostProviderExtension]
public class HasImageErrorCheckerPostExtension : IPostProviderExtension
{
public void BindEvents(PostProviderBase postProvider)
{
postProvider.Added += new PostChanged(postProvider_Added);
}
void postProvider_Added(Model.PostInfo post)
{
try
{
StackFrame[] stacks = new StackTrace().GetFrames();
if (post.Content.IndexOf("IMG") > -1 && post.HasImage == false)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("問(wèn)題出現(xiàn)");
sb.AppendLine("stack is:");
sb.Append(ToString(stacks));
sb.Append("content=");
sb.AppendLine(post.Content);
sb.Append("HasImage=");
sb.AppendLine(UserPostContentProcessor.HasImage(post.Content).ToString());
sb.Append("createUserID=");
sb.AppendLine(post.CreateUserID.ToString());
sb.AppendLine(string.Format("LoginUser={0},Level={1}",PageBase.GetLoginUser().ID,PageBase.GetLoginUser().LevelNo));
TextLogWriter.NamedInstance("\\log\\HasImageErrorCheckerPostExtension\\").Write(sb.ToString());
}
}
catch (Exception ex)
{
TextLogWriter.NamedInstance("\\log\\HasImageErrorCheckerPostExtension\\").Write(ex);
}
}
private string ToString(StackFrame[] stacks)
{
string result = string.Empty;
foreach (StackFrame stack in stacks)
{
result += string.Format("{0} {1} {2} {3}\r\n", stack.GetFileName(),
stack.GetFileLineNumber(),
stack.GetFileColumnNumber(),
stack.GetMethod().ToString());
}
return result;
}
}
上面類HasImageErrorCheckerPostExtension繼承自IPostProviderExtension并且有PostProviderExtension屬性修飾,系統(tǒng)會(huì)自動(dòng)調(diào)用它并在發(fā)帖時(shí)觸發(fā)這里綁定的事件。這里的核心代碼是new StackTrace().GetFrames()通過(guò)這個(gè)方法可以得到當(dāng)前程序執(zhí)行時(shí)的堆棧信息。在Release模式下可以得到調(diào)用的方法名,在Debug模式下可以得到具體的文件行號(hào),列號(hào)。
這個(gè)方法是調(diào)試中不能重現(xiàn)問(wèn)題時(shí)的一種查找問(wèn)題的選擇方案。
起因:
論壇發(fā)帖子有幾個(gè)途徑,有可能是新聞系統(tǒng)直接導(dǎo)入的帖子,也有可能是抓取的帖子,還有可能是用戶通過(guò)正常途徑發(fā)表。但是這兩天出了一個(gè)問(wèn)題,有些帖子的HasImage屬性不對(duì)。通過(guò)幾種方法做調(diào)試都不能重現(xiàn)問(wèn)題,沒(méi)有辦法,只有在程序中添加回復(fù)的地方添加日志程序來(lái)記錄堆棧,從而追蹤到是哪個(gè)途徑發(fā)帖出現(xiàn)了問(wèn)題。
代碼:
復(fù)制代碼 代碼如下:
[PostProviderExtension]
public class HasImageErrorCheckerPostExtension : IPostProviderExtension
{
public void BindEvents(PostProviderBase postProvider)
{
postProvider.Added += new PostChanged(postProvider_Added);
}
void postProvider_Added(Model.PostInfo post)
{
try
{
StackFrame[] stacks = new StackTrace().GetFrames();
if (post.Content.IndexOf("IMG") > -1 && post.HasImage == false)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("問(wèn)題出現(xiàn)");
sb.AppendLine("stack is:");
sb.Append(ToString(stacks));
sb.Append("content=");
sb.AppendLine(post.Content);
sb.Append("HasImage=");
sb.AppendLine(UserPostContentProcessor.HasImage(post.Content).ToString());
sb.Append("createUserID=");
sb.AppendLine(post.CreateUserID.ToString());
sb.AppendLine(string.Format("LoginUser={0},Level={1}",PageBase.GetLoginUser().ID,PageBase.GetLoginUser().LevelNo));
TextLogWriter.NamedInstance("\\log\\HasImageErrorCheckerPostExtension\\").Write(sb.ToString());
}
}
catch (Exception ex)
{
TextLogWriter.NamedInstance("\\log\\HasImageErrorCheckerPostExtension\\").Write(ex);
}
}
private string ToString(StackFrame[] stacks)
{
string result = string.Empty;
foreach (StackFrame stack in stacks)
{
result += string.Format("{0} {1} {2} {3}\r\n", stack.GetFileName(),
stack.GetFileLineNumber(),
stack.GetFileColumnNumber(),
stack.GetMethod().ToString());
}
return result;
}
}
上面類HasImageErrorCheckerPostExtension繼承自IPostProviderExtension并且有PostProviderExtension屬性修飾,系統(tǒng)會(huì)自動(dòng)調(diào)用它并在發(fā)帖時(shí)觸發(fā)這里綁定的事件。這里的核心代碼是new StackTrace().GetFrames()通過(guò)這個(gè)方法可以得到當(dāng)前程序執(zhí)行時(shí)的堆棧信息。在Release模式下可以得到調(diào)用的方法名,在Debug模式下可以得到具體的文件行號(hào),列號(hào)。
這個(gè)方法是調(diào)試中不能重現(xiàn)問(wèn)題時(shí)的一種查找問(wèn)題的選擇方案。
您可能感興趣的文章:
- C#棧和隊(duì)列的簡(jiǎn)介,算法與應(yīng)用簡(jiǎn)單實(shí)例
- C#實(shí)現(xiàn)用棧求逆序的方法示例
- C#創(chuàng)建安全的棧(Stack)存儲(chǔ)結(jié)構(gòu)
- C#使用Object類實(shí)現(xiàn)棧的方法詳解
- C#數(shù)據(jù)結(jié)構(gòu)之堆棧(Stack)實(shí)例詳解
- 一看就懂:圖解C#中的值類型、引用類型、棧、堆、ref、out
- C#使用foreach語(yǔ)句遍歷堆棧(Stack)的方法
- 淺談C#中堆和棧的區(qū)別(附上圖解)
- c#棧變化規(guī)則圖解示例(棧的生長(zhǎng)與消亡)
- C#棧和堆的區(qū)別淺談
- C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘五 棧和隊(duì)列
- C#實(shí)現(xiàn)順序棧和鏈棧的代碼實(shí)例
相關(guān)文章
C#編寫(xiě)Windows服務(wù)程序詳細(xì)步驟詳解(圖文)
本文介紹了如何用C#創(chuàng)建、安裝、啟動(dòng)、監(jiān)控、卸載簡(jiǎn)單的Windows Service 的內(nèi)容步驟和注意事項(xiàng),需要的朋友可以參考下2017-09-09詳細(xì)聊聊C#的并發(fā)機(jī)制優(yōu)秀在哪
并發(fā)其實(shí)是一個(gè)很泛的概念,字面意思就是"同時(shí)做多件事",不過(guò)方式有所不同,下面這篇文章主要給大家介紹了關(guān)于C#并發(fā)機(jī)制的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02Unity shader實(shí)現(xiàn)百葉窗特效
這篇文章主要為大家詳細(xì)介紹了Unity shader實(shí)現(xiàn)百葉窗特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04