c#在未出現異常情況下查看當前呼叫堆疊

來源:互聯網
上載者:User

C#查看堆棧通常是在異常處理中,出現異常之後通過異常的堆棧可以很方便的得到出現這個錯誤的代碼調用路徑。這個很有用,是否可以在沒有異常出現時使用這種方法排查一些非異常錯誤呢?答案是肯定的。

起因:

論壇發文章有幾個途徑,有可能是新聞系統直接匯入的文章,也有可能是抓取的文章,還有可能是使用者通過正常途徑發表。但是這兩天出了一個問題,有些文章的HasImage屬性不對。通過幾種方法做調試都不能重現問題,沒有辦法,只有在程式中添加回複的地方添加日誌程式來記錄堆棧,從而追蹤到是哪個途徑發帖出現了問題。

代碼:

[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("問題出現");                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屬性修飾,系統會自動調用它並在發帖時觸發這裡綁定的事件。這裡的核心代碼是new StackTrace().GetFrames()通過這個方法可以得到當前程式執行時的堆棧資訊。在Release模式下可以得到調用的方法名,在Debug模式下可以得到具體的檔案行號,列號。

這個方法是調試中不能重現問題時的一種尋找問題的選擇方案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.