• 调试


    Visual Studio - 调试

    异常处理机制

    windows预定义了一系列的异常错误码,每种程序异常都有一个对应的错误码,windows系统将这些类似键值对关系的数据存储在异常处理表中(称为SEH结构化异常处理表)。当CPU执行程序指令时,如果指令出现错误,那么CPU会识别错误所对应的错误码,接着执行流程会进入SEH,查找错误码所对应的处理程序,C++、.Net的程序异常都是由RaiseException函数进行处理,异常被处理之后CPU才会继续执行下一句指令。

        异常码                          处理程序
    0xC0000005    AccessViolationExceptionHandler( )
    0x80000003     LaunchOrNotifyDebugger( )
    ……

    比如打开一个编译后的程序(如:CUI程序MyApp.exe),当程序出现异常后会被CPU挂起,会进入RaiseException,假如代码具有try、catch块,则会把异常交给try、catch处理,如果没有try、catch块,那么异常会交给windows自带的异常处理块,该异常处理块会检查MyApp.exe的程序代码是否是由某个调试器运行起来的,如果是,就向调试器发出通知,这样,调试器就会对异常做出处理,比如visual studio自带的调试器就是在此时抛出异常信息的,但如果MyApp.exe的程序代码并不是由某个调试器运行起来的,那么window就要调用内置的Dr Watson调试器对异常代码进行"尸检",也即它会通过一个提示框将错误信息抛出。

    开启web应用程序的调试

    打开web.config,在System.Web配置节将compilation 设为true即可开启调试

    <system.web>
         <compilation debug="false" targetFramework="4.6.1" />
    </system.web>

    当设为false后:

     

    断点调试

    普通断点

    光标定位到所在行或直接单击行左侧空白处,会显示一个红色图标表示断点到此处,程序运行时执行到断点处就会暂停。

     

    断点后按F5或直接点击启动按钮,当程序执行到断点处会暂停,此时可以查看变量当前的值。

    条件

    执行到断点处并不会暂停,直到满足预设的条件后才会暂停。右击断点的红图标 - 条件,可以看到与条件有关的三个下拉选项

    条件表达式:可设置一个当前程序所使用的语言的表达式,比如C#的表达式,表达式为true时就会进入断点,程序会暂停。

    命中次数:使循环体循环到某个特定次数的时候才暂停,可设置==、>=或数倍于,可描述为:当前循环次数==或>=或数倍于

    筛选器:指定当执行到哪个线程时才会进入断点

    当循环次数>=500时会进入断点,下图可以看到c=499时进入中断模式,因为0-499就是500次。

    在断点模式下可以右击红色断点图标继续设置断点条件,达到条件会再次进入断点。右击断点 - 条件,将命中次数设为800

    按继续,会发现循环只有在前进到800次时才会进入断点。

    操作

    下断点后,右击断点,选择"操作",这种调试方式不会进入中断模式,但会将指定的变量输出到输出窗口,输入框可填写由VS提供的变量占位符和你想查看的变量值,当命中断点后会将输入框设置的变量当做文本输出到输出窗口,变量值应填写在{}括号中 

    $FUNCTION将当前断点所在的函数的名称作为字符输出
    $CALLER将正在调用当前函数的函数的名称作为字符输出
    $ADDRESS将正在调用当前函数的指令作为字符输出
    $CALLSTACK将正在执行当前函数的堆栈名称作为字符输出
    $PID将正在调用当前函数的进程ID作为字符输出
    $PNAME将正在调用当前函数的进程名称作为字符输出
    $TID将正在调用当前函数的线程ID作为字符输出
    $TNAME将正在调用当前函数的线程名称作为字符输出

    如:

    可取消勾选继续执行,这样当命中断点后会中断代码的执行,否则不会。输出结果如下图:

     

    调试快捷键

    F5:调试的开关(等同于继续按钮),按第一次是执行调试,按第二次是结束调试
    F9:为光标所在行下断点
    F10:逐过程,即逐条执行,遇到函数时会跳过函数的执行过程直。函数包括了方法、属性、索引器等。但如果为函数体的任何语句下了断点,F10还是会进入函数的断点处。
    F11:逐语句,即逐条执行,遇到函数时会进入函数体。
    Shift+F11:当按F11逐语句进入了调用函数的内部时,可以按此键位退出当前执行的函数体内部,调到外部

    调试类(system.diagnostics)

    Debug类和Trace类都提供了静态方法用于调试,区别仅在于Debug只能在调试版本中有效,而Trace类在调试版本或发布版本中都有效。利用这两个类,你可以将感兴趣的变量输出到指定的窗口,这些窗口称为侦听器窗口。当你使用调试时看见的输出窗口就是一个默认的侦听器窗口,而所有的侦听器窗口都从TraceListener派生。

    DefaultTraceListener;
    //调试模式下的Visualt studio输出窗口
    TextWriterTraceListener;
    //txt窗口,即一个txt文档
    EventLogTraceListener;
    //windows事件日志窗口,即windows的事件日志文档
    ConsoleTraceListener;
    //控制台窗口
    XmlWriterTraceListener;
    //xml窗口,即一个xml文档

    例子

    //显示用户列表
    public ActionResult Index()
    {
        List<UserView> users = new List<UserView>();
        foreach (AppUser user in UserManager.Users)
        {
            users.Add(new UserView { Id = user.Id, Name = user.UserName, Email = user.Email, Password = user.PasswordHash });
        }
        Debug.Listeners.Add( new TextWriterTraceListener@"E:logTest.txt" ) );
        Debug.AutoFlush = true
        foreach (var u in users)
        {
            Debug.WriteLine( $"用户:{u.Name}" ); //将数据写入所有的侦听器窗口
        }
        Debug.Close( );
        return View(users);
    }

     

     

    调试 - 学习总目录

     

  • 相关阅读:
    数据库之事务与常见故障
    数学的魅力 之 正多边形
    html5 的基础理解1
    android 引入开源项目
    android 图片查看器
    java 线程安全
    python3 自动生成requirement.txt
    centos 7 安装 python3.7
    python3 创建,激活虚拟环境
    Mac 配置poetry
  • 原文地址:https://www.cnblogs.com/myrocknroll/p/8418993.html
Copyright © 2020-2023  润新知