Visual Studio的调试技巧 visual+studio的调试技巧有哪些
liebian365 2024-10-15 13:42 45 浏览 0 评论
来源:asmlcnblogs.com/DragonStart/p/7843977.html
调试技巧是衡量程序员水平的一个重要指标.掌握好的调试技巧与工具的使用方法,也是非常重要的.
演示环境
- VS2017
- C#
演示用的代码
public class Program{ private static int data { get; set; } = 0; public static void Main(string[] argv) { data = 10; new Thread(new ThreadStart(T1)) { IsBackground = true }.Start(); new Thread(new ThreadStart(T2)) { IsBackground = true }.Start(); Console.ReadKey(true); } private static int DataA { get; set; } = 0; private static int DataB = 0; private static void T1() { while (true) { DataA += 1; Thread.Sleep(1000); } } private static void T2() { while (true) { DataB += 1; Thread.Sleep(1000); } }}//End Class
基本概念:断点
这是最基本的操作了,想必大伙都会了...
我们可以点击编辑器的这个地方:
给代码添加一个断点,这样当代码执行到这里的时候就会挂起进程,此时代码会暂停执行,并等待用户操作.
如何继续?
可按以下快捷键其中一个来实现继续:
- F5(继续执行,直到再次遇到断点,或者按Ctrl+Alt+Break键强行中断)
- F10(步过,继续执行,但是到下一行又会挂起,不管下一行有没有断点)
- F11(步入,和步过同效,但如果当前挂起位置是一个函数的话,下一步会进到函数里)
- Shift+F11(步出,执行到当前函数返回)
挂起的生效范围
这个挂起,是对整个进程生效的,也就是说所有线程都会暂停.
挂起状态:
在挂起的时候能做的事
查看或修改变量的值
如同图中那样,当鼠标指针指向变量名的时候,可以查看或修改该变量的值,修改完要按回车确认。
该操作仅限当前位置作用域内的变量。
控制线程下一步要执行的代码位置
看图中左边的小箭头,其实是能拖动的!可以把他往上或往下拖,从而改变线程下一步要执行的代码位置,但是有两点要注意:
- 位置改变了,但是操作过的变量值不会改变,所以别指望能用来倒退已经执行过的操作。
- 改变是有范围的,不能跳到别的函数,就算是局部函数,也不能跳到外面。
在数据被改变/读取的时候挂起(面向对象版数据断点)
有时候代码执行到某地方,某个变量就会被莫名其妙的改了.这时候我们需要找出来是哪里改了这个变量。
VS有提供一个叫做[数据断点]的东西,但那个只支持native类的语言,C#是不行的.
但有个不是很完美的方法:
我们可以给目标变量加上get;set;访问器,然后在上面加断点,看开头的代码:
private static int data{ get; set;} = 0;
效果如下:
这时候按住Ctrl键不放,接着连续按D T键,就能呼出调用堆栈窗口,看是哪里在尝试修改这个变量,也可以按Shift+F11,执行到返回,这样就能直接跳到修改这个变量的代码:
说这个方法不完美是因为它对没有代码的其它dll里的全局变量无法使用.
给断点加条件
当我们在循环里打断点的时候,断点会被循环触发,这样调试起来就很麻烦了,我们可以给断点加条件,让断点满足条件才触发。
按住Ctrl键不放,接着连续按D B键,能看到所有断点的列表。
在目标断点按下鼠标右键,在菜单里选择设置.可进入断点设置界面:
给条件打上勾.可看到有三种条件模板,三个模板可相与(居然不能相或...)
条件表达式
可以输入一条表达式,以表达式的结果决定是否触发,表达式参数可以是当前断点作用域内的变量或常量,判断方式有两种:
- 表达式结果返回true时触发
- 表达式结果变化时触发(只支持bool类型结果)
提醒:如果想要在返回false的情况下触发,可以把表达式改为: !(表达式)
命中次数
代码执行过断点次数达到一定次数才触发,这个模版分为三种类型:
- 等于:执行过第x次触发断点
- 大于等于:执行过第x次以及之后都触发
- 倍数于:代码执行过x的倍数次时触发断点
筛选器
可根据线程ID,线程名,进程ID,进程名,机器名,等条件决定是否断下线程.各条件之间可进行逻辑操作
多线程调试
按住Ctrl键不放,接着连续按D T键,能显示[线程]窗口,可从中看到当前调试进程的所有线程。
查看所有线程当前位置
点菜单栏的这个地方,能显示所有线程挂起时的位置:
效果如下:
冻结一个线程
这时候我们可以单独冻结一个线程,让这个线程被单独挂起,其它线程继续调试,选择线程,然后点这里:
如你所见,解冻按钮就在旁边...
线程被冻结后,就会被单独挂起,直到解冻才继续执行.
切换线程
如果当前挂起的线程不是自己要调试的线程,可以在这里切换到别的线程:
相关推荐
- C#夯实基础-Lambda在List中的使用
-
在C#中基本类型比如List,Dictionary,数组等都有委托来实现相关的操作。此时Lambda表达式就可以使用了.实例1,查找字符串List的包含a的元素...
- 在C#中,如何实现对集合中元素的自定义排序?
-
在C#中,可以通过多种方式实现对集合中元素的自定义排序,主要包括:...
- C++11 新特性面试题_c++ 11 面试题
-
1、C++11中引入了哪些新的智能指针类型?请描述它们的用法和区别。C++11中引入了三种新的智能指针类型:std::unique_ptr,std::shared_ptr,和std::weak_...
- 为什么要使用lambda表达式?原来如此,涨知识了
-
为什么要使用Lambda表达式先看几段Java8以前经常会遇到的代码:创建线程并启动...
- [编程基础] Python lambda函数总结
-
Pythonlambda函数教程展示了如何在Python中创建匿名函数。Python中的匿名函数是使用lambda关键字创建的。...
- 硬核!Java 程序员必须掌握的 10 个 简化代码的 Lambda 表达式!
-
大家好,我是一位在架构师道路上狂奔的码农,今天给大家介绍一下程序员必须掌握的10个Lambda表达式,这些表达式几乎涵盖了在实际编程中经常用到的常见场景。相信通过这10个Lambda表...
- 一文读懂lambda表达式_lambda表达式由来
-
作者:youngyan,腾讯PCG数据工程工程师...
- Java基础知识 - lambda 表达式_javalambda表达式用法
-
1、表达式语法1)lambda的命名采用的是数学符号λ;...
- Python学习笔记 | 匿名函数lambda、映射函数map和过滤函数filter
-
什么是匿名函数?定义:没有函数名的自定义函数场景:函数体非常简单,使用次数很少,没有必要声明函数,通常搭配高阶函数使用。...
- Java Lambda表达式详解(非常全面)
-
JavaLambda表达式是JDK8引入的,是一个比较重要的特性。@mikechenLambda表达式简介...
- 了解 Lambda:Python 中的单个表达式函数
-
Python中的lambda关键字提供了声明小型匿名函数的快捷方式。Lambda函数的行为与使用...
- 在C#中使用Lambda编写一个排序算法,比较其与传统排序算法的优劣
-
使用Lambda表达式编写排序算法在C#中,Lambda表达式可以用来简化排序逻辑的编写,尤其是在需要自定义排序规则时非常方便。以下示例展示了如何用Lambda表达式实现排序,并与传统排...
- 一日一技:python中的匿名函数 lambda用法
-
匿名函数lambda,语法如下:lambdaarguments:expression...
- 《回炉重造》——Lambda表达式_回炉重造是贬义词吗
-
前言Lambda表达式(LambdaExpression),相信大家对Lambda肯定是很熟悉的,毕竟我们数学上经常用到它,即λ。不过,感觉数学中的Lambda和编程语言中的Lamb...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)