调试 - Visual Studio调试
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即可开启调试
<compilation debug="false" targetFramework="4.6.1" />
</system.web>
当设为false后:

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

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

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

条件表达式:可设置一个当前程序所使用的语言的表达式,比如C#的表达式,表达式为true时就会进入断点,程序会暂停。
命中次数:使循环体循环到某个特定次数的时候才暂停,可设置==、>=或数倍于,可描述为:当前循环次数==或>=或数倍于
筛选器:指定当执行到哪个线程时才会进入断点

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

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

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

操作
下断点后,右击断点,选择"操作",这种调试方式不会进入中断模式,但会将指定的变量输出到输出窗口,输入框可填写由VS提供的变量占位符和你想查看的变量值,当命中断点后会将输入框设置的变量当做文本输出到输出窗口,变量值应填写在{}括号中
$CALLER:将正在调用当前函数的函数的名称作为字符输出
$ADDRESS:将正在调用当前函数的指令作为字符输出
$CALLSTACK:将正在执行当前函数的堆栈名称作为字符输出
$PID:将正在调用当前函数的进程ID作为字符输出
$PNAME:将正在调用当前函数的进程名称作为字符输出
$TID:将正在调用当前函数的线程ID作为字符输出
$TNAME:将正在调用当前函数的线程名称作为字符输出
如:

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

调试快捷键
F9:为光标所在行下断点
F10:逐过程,即逐条执行,遇到函数时会跳过函数的执行过程直。函数包括了方法、属性、索引器等。但如果为函数体的任何语句下了断点,F10还是会进入函数的断点处。
F11:逐语句,即逐条执行,遇到函数时会进入函数体。
调试类(system.diagnostics)
Debug类和Trace类都提供了静态方法用于调试,区别仅在于Debug只能在调试版本中有效,而Trace类在调试版本或发布版本中都有效。利用这两个类,你可以将感兴趣的变量输出到指定的窗口,这些窗口称为侦听器窗口。当你使用调试时看见的输出窗口就是一个默认的侦听器窗口,而所有的侦听器窗口都从TraceListener派生。
//调试模式下的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);
}
调试 - Visual Studio调试的更多相关文章
- Visual Studio 调试(系列文章)
调试是软件开发过程中非常重要的一个部分,它具挑战性,但是也有一定的方法和技巧. Visual Studio 调试程序有助于你观察程序的运行时行为并发现问题. 该调试器可用于所有 Visual Stud ...
- Visual Studio 调试 ---- 系列文章
调试是软件开发过程中非常重要的一个部分,它具挑战性,但是也有一定的方法和技巧. Visual Studio 调试程序有助于你观察程序的运行时行为并发现问题. 该调试器可用于所有 Visual Stud ...
- 用Visual Studio调试Windows和驱动程序
由于本人能力有限,翻译不足之处敬请谅解,欢迎批评指正:sunylat@163.com Visual Studio版本:Visual Studio 2015企业版,中文环境. MSDN原文:https: ...
- VISUAL STUDIO 调试
调试术语 Visual Studio调试之断点基础篇 Visual Studio调试之断点进阶篇 不能设置断点的检查步骤 Visual Studio调试之断点技巧篇 Visual Studio调试之断 ...
- 用Natvis定制C++对象在Visual Studio调试时如何显示
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Natvis定制C++对象在Visual Studio调试时如何显示.
- Visual Studio调试之避免单步跟踪调试模式
Visual Studio调试之避免单步跟踪调试模式 写完Visual Studio调试之断点进阶篇之后,想分享一下我常用的一些调试技巧,后面发现写之前,一些背景知识需要介绍一下. 下面是几篇今年2月 ...
- Visual Studio调试之断点进阶篇
Visual Studio调试之断点进阶篇 在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel系列CPU的一个指令,可以让程序产生一个中断或者异常.程序中 ...
- Visual Studio调试之断点基础篇
Visual Studio调试之断点基础篇 我曾经问过很多人,你一般是怎么调试你的程序的? F9, F5, F11, F…… 有很多书和文章都是介绍怎么使用Visual Studio编写WinForm ...
- 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件
查找并指定符号文件和源文件:指定符号加载行为.使用符号和源服务器上:加载符号自动或在要求. 内容 查找符号 (.pdb) 文件 查找源文件 查找符号 (.pdb) 文件 说明 在之前的 Vis ...
随机推荐
- (分治法 快速幂)51nod1046 A^B Mod C
1046 A^B Mod C 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. 收起 输入 3个正整数A B C,中间用空格分隔.(1 < ...
- Zabbix Web API Get方法整合
#!/usr/bin/python3 import requests,json,re,time,datetime url = 'http://xxx.com/api_jsonrpc.php' ...
- python自动化开发-[第六天]-常用模块、面向对象
今日概要: 1.常用模块 - os模块 - random模块 - shutil模块 - hashlib模块 - pickle/json模块 - shelve模块 - configparser模块 - ...
- Hadoop基础-通过IO流操作HDFS
Hadoop基础-通过IO流操作HDFS 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上传文件 /* @author :yinzhengjie Blog:http://www ...
- 第04篇 JDK版本导致Unsupported major.minor version 52.0 error
一直以来,想改变一些自己早已经习惯的事情. 感谢吕希德同学,让我又解决了一个问题! 出现问题原因-->>分析 { JDK版本不一致的问题 } 在eclipse中开发的项目有个Java bu ...
- Linux记录-linux系统常用监控指标
1.Linux运维基础采集项 做运维,不怕出问题,怕的是出了问题,抓不到现场,两眼摸黑.所以,依靠强大的监控系统,收集尽可能多的指标,意义重大.但哪些指标才是有意义的呢,本着从实践中来的思想,各位工程 ...
- 【1】【leetcode-99】 恢复二叉搜索树
(没思路) 99. 恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ ...
- VS Code +node npm 调试 js
打开vsCode的调试控制台里面的终端 然后输入下面代码 npm install express-generator -g 1 创建一个命名为 myapp 的应用. express myapp 你就可 ...
- Spring MVC整合Mybatis 入门
本文记录使用Intellij创建Maven Web工程搭建Spring MVC + Mybatis 的一个非常简单的示例.关于Mybatis的入门使用可参考这篇文章,本文在该文的基础上,引入了Spri ...
- js 操作对象 记录
js 对象记录一下: let obj_1 = { name : 'james', age : '22', sex: '1' } for ( i in obj_1 ) { console.log(i) ...