解析c#在未出現(xiàn)異常情況下查看當前調用堆棧的解決方法
更新時間:2013年05月18日 11:49:02 作者:
本篇文章是對c#在未出現(xiàn)異常情況下查看當前調用堆棧的解決方法進行了詳細的分析介紹,需要的朋友參考下
C#查看堆棧通常是在異常處理中,出現(xiàn)異常之后通過異常的堆??梢院芊奖愕牡玫匠霈F(xiàn)這個錯誤的代碼調用路徑。這個很有用,是否可以在沒有異常出現(xiàn)時使用這種方法排查一些非異常錯誤呢?答案是肯定的。
起因:
論壇發(fā)帖子有幾個途徑,有可能是新聞系統(tǒng)直接導入的帖子,也有可能是抓取的帖子,還有可能是用戶通過正常途徑發(fā)表。但是這兩天出了一個問題,有些帖子的HasImage屬性不對。通過幾種方法做調試都不能重現(xiàn)問題,沒有辦法,只有在程序中添加回復的地方添加日志程序來記錄堆棧,從而追蹤到是哪個途徑發(fā)帖出現(xià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("問題出現(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)會自動調用它并在發(fā)帖時觸發(fā)這里綁定的事件。這里的核心代碼是new StackTrace().GetFrames()通過這個方法可以得到當前程序執(zhí)行時的堆棧信息。在Release模式下可以得到調用的方法名,在Debug模式下可以得到具體的文件行號,列號。
這個方法是調試中不能重現(xiàn)問題時的一種查找問題的選擇方案。
起因:
論壇發(fā)帖子有幾個途徑,有可能是新聞系統(tǒng)直接導入的帖子,也有可能是抓取的帖子,還有可能是用戶通過正常途徑發(fā)表。但是這兩天出了一個問題,有些帖子的HasImage屬性不對。通過幾種方法做調試都不能重現(xiàn)問題,沒有辦法,只有在程序中添加回復的地方添加日志程序來記錄堆棧,從而追蹤到是哪個途徑發(fā)帖出現(xià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("問題出現(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)會自動調用它并在發(fā)帖時觸發(fā)這里綁定的事件。這里的核心代碼是new StackTrace().GetFrames()通過這個方法可以得到當前程序執(zhí)行時的堆棧信息。在Release模式下可以得到調用的方法名,在Debug模式下可以得到具體的文件行號,列號。
這個方法是調試中不能重現(xiàn)問題時的一種查找問題的選擇方案。
相關文章
wpf將表中數(shù)據(jù)顯示到datagrid示例
這篇文章主要介紹了wpf將表中數(shù)據(jù)顯示到datagrid示例,需要的朋友可以參考下2014-02-02
Avalonia封裝實現(xiàn)指定組件允許拖動的工具類
這篇文章主要為大家詳細介紹了Avalonia如何封裝實現(xiàn)指定組件允許拖動的工具類,文中的示例代碼講解詳細,感興趣的小伙伴快跟隨小編一起來學習學習吧2023-03-03

