解析c#在未出现异常情况下查看当前调用堆栈的解决方法

时间:2023-05-18 02:54:04 

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模式下可以得到具体的文件行号,列号。
这个方法是调试中不能重现问题时的一种查找问题的选择方案。

标签:c#,调用堆栈
0
投稿

猜你喜欢

  • Java如何处理延迟任务过程解析

    2022-04-29 15:11:37
  • 揭秘双十一手机淘宝图标如何被动态更换

    2022-06-05 20:14:04
  • Spring Cloud Gateway 默认的filter功能和执行顺序介绍

    2021-07-01 21:31:46
  • Android高性能日志写入方案的实现

    2022-09-18 17:12:50
  • 2021最新Android笔试题总结美团Android岗职能要求

    2023-11-29 15:24:52
  • 深入理解Spring中bean的生命周期介绍

    2023-02-08 17:21:37
  • Android自定义荷载进度的两种方法

    2022-08-29 03:21:39
  • 基于opencv实现车道线检测

    2023-03-11 10:07:52
  • .net 随机生成汉字

    2022-01-22 08:33:33
  • Java 入门图形用户界面设计之复选框

    2022-06-19 15:22:53
  • 第1个Android应用程序 Android制作简单单页导航

    2022-09-27 22:23:26
  • C#利用SharpPcap实现网络包捕获嗅探

    2021-11-24 00:47:27
  • java实现图片缩放、旋转和马赛克化

    2021-07-23 03:04:54
  • C# 实现颜色的梯度渐变案例

    2023-11-20 22:01:06
  • Android Studio 一键生成Json实体类教程

    2023-05-19 20:13:39
  • Springboot2以代码的方式统一配置Jackson教程

    2021-08-30 16:47:33
  • C#通过指针读取文件的方法

    2023-02-21 03:08:10
  • SpringBoot配置拦 截器实现过程详解

    2023-11-24 17:14:58
  • Android Studio使用教程(一):下载与安装及创建HelloWorld项目

    2022-10-14 19:00:15
  • 项目为什么引入log4j而不是logback代码

    2023-02-02 07:51:07
  • asp之家 软件编程 m.aspxhome.com