title author date CreateTime categories
VisualStduio 打断点调试和不打断点调试有什么区别
lindexi
2018-08-10 19:16:52 +0800
2018-2-21 11:9:34 +0800
VisualStudio 调试

最近小伙伴告诉我,他的代码在打断点的时候,运行到断点,之后就可以运行。如果没有断点,他的代码就无法运行,经过了一段时间的研究才发现,原来打断点和不打断点是有一些区别。
本文来告诉大家,如果在自己的软件发现打断点之后程序和不打有区别,如在打断点之后程序可以运行,不打就不能运行,那么可以从下面的方法开始查看是否程序的问题。

实际上进入断点之后的运行有一个很大的不同在于时间。对于线程调度等,因为时间的不同,进行调度的顺序可能被修改。例如有两个线程,使用相同属性,请看代码。

int n = 0;

//线程1
if(n == 0)
{
n ++;
} //线程2
if(n == 1)
{
//代码
}

这时如果同时运行 线程1 和 线程2 ,可能线程2的代码就不会运行,因为他判断的 n 还是 0 不是 1。在线程2的判断打断点,这时会发现,经常可以运行代码。

所以遇到打断点问题,那么请看一下使用的判断是否使用很多线程,所以遇到断点让程序可以运行或者不能的时候,先看一下是不是线程的问题。有没有属性没有加锁。

随机数

最近在测试框架也看到随机数的问题。

下面是一个简单的类,在构造创建一个随机数,判断相同使用的是判断随机数属性是否相同。实际上小伙伴的问题是有随机数。默认的随机数的构造方法使用的是时间,所以如果创建两个随机数,可能拿到的值是相同,请看下面的代码

    class DhtwSwyotml : IEquatable<DhtwSwyotml>
{
/// <inheritdoc />
public DhtwSwyotml()
{
var ran = new Random();
HvkemkKevavvqur = ran.Next();
} public int HvkemkKevavvqur { get; set; } /// <inheritdoc />
public bool Equals(DhtwSwyotml other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return HvkemkKevavvqur == other.HvkemkKevavvqur;
} /// <inheritdoc />
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((DhtwSwyotml) obj);
} /// <inheritdoc />
public override int GetHashCode()
{
return HvkemkKevavvqur;
} public static bool operator ==(DhtwSwyotml left, DhtwSwyotml right)
{
return Equals(left, right);
} public static bool operator !=(DhtwSwyotml left, DhtwSwyotml right)
{
return !Equals(left, right);
}
}

如果使用的是两个不同的对象,那么一般判断相等都是 false ,但是下面的代码在不打断点可能进入错误的代码

        static void Main(string[] args)
{
var sutpSgeg = new DhtwSwyotml();
var kzduDglirxr = new DhtwSwyotml();
if (sutpSgeg.Equals(kzduDglirxr))
{
//xx 这时不应该进入
Console.WriteLine("错误进入");
} Console.WriteLine(sutpSgeg.HvkemkKevavvqur);
Console.WriteLine(kzduDglirxr.HvkemkKevavvqur); }

在 kzduDglirxr 打断点和不在他这里打断点,得到不相同的结果。来两个不同的对象希望返回 false ,结果写为 true ,而且在 kzduDglirxr 断点可以看到不会进入错误的代码。打的时候不会进入判断相等的代码,但是不打的时候可能可以进入判断相等。因为Random的构造函数默认给他是当前的时间,两个对象的创建使用的时间很短,所以创建的随机数可能就相同。但是不是所有的运行都能进入判断。我把上面代码给我小伙伴,结果他一直运行都是不会进入错误的代码。

参见:Make GenericParameterHelper's behavior same between running and debugging by walterlv · Pull Request #362 · Microsoft/testfx

所以在发现断点和没有之间出现不同的,请看一下是不是有线程问题或者随机数问题和所有时间有关的。

2018-8-10-VisualStduio-打断点调试和不打断点调试有什么区别的更多相关文章

  1. 01 mybatis框架整体概况(2018.7.10)-

    01 mybatis框架整体概况(2018.7.10)- F:\廖雪峰 JavaEE 企业级分布式高级架构师课程\廖雪峰JavaEE一期\第一课(2018.7.10) maven用的是3.39的版本 ...

  2. iOS LLDB调试器和断点调试

    技巧一:运行时修改变量的值 你以前怎么验证是不是某个变量的值导致整段程序不能正常工作?修改代码中的变量的值,然后cmd+r重新启动app?现在你不需要这么做了,只需要设置一个断点,当程序在这进入调试模 ...

  3. Visual Studio 调试系列3 断点

    系列目录     [已更新最新开发文章,点击查看详细] 断点是开发人员的工具箱中最重要的调试技术之一. 若要暂停调试程序执行所需的位置设置断点. 例如,你可能想要查看代码变量的状态或查看调用堆栈的某些 ...

  4. GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断

    多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程 ...

  5. 申请Office 365一年免费的开发者账号攻略(2018年10月份版本)

    要进行Office 365开发,当然需要有完整的Office 365环境才可以.为了便于广大开发人员快速地启动这项工作,微软官方给所有开发人员提供了免费的一年开发者账号   那么如何申请Office ...

  6. IntelliJ IDEA 最新激活码(截止到2018年10月14日)

    IntelliJ IDEA 注册码: EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYX ...

  7. 新手C#SQL Server使用记录2018.08.10

    主键(PrimaryKey):主键就是每个数据行(记录)的唯一标识,不会有重复值的列(字段)才能当做主键.一个表可以没有主键,但是这样会很难处理表,因此一般情况表都要设置主键. 主键有两张选用策略,分 ...

  8. C#.NET常见问题(FAQ)-程序如何单步调试和设置断点

    对于控制台程序而言,直接按F10(不按F5运行)就可以单步运行,当前运行行会显示为黄色(不管是一条语句,还是一个函数,都会直接执行完毕得到结果)   你可以在变量名上右击添加监视(会自动放到监视1中) ...

  9. Chrome调试ECMAScript之断点debug技巧大全!

    这篇文章主要介绍了使用Chrome调试JavaScript的断点设置和调试技巧,需要的朋友可以参考下 你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍 ...

随机推荐

  1. 剑指offer——70n个骰子的点数

    题目: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 题解: 使用两个数组存每次投的点数 void theProbability(const int ...

  2. ajax中的onload和readychange区别

    先补个知识点: readyState 状态码: 0:请求未初始化 1:服务器连接已建立 2:请求已接受 3:请求处理中 4:请求已完成,且响应已就绪 HTTP 状态码: 200 - 服务器成功返回网页 ...

  3. Handler Looper源码解析(Android消息传递机制)

    Android的Handler类应该是常用到的,多用于线程间的通信,以及子线程发送消息通知UI线程刷新View等等.这里我主要总结下我对整个消息传递机制,包括Handler,Looper,Messag ...

  4. 使用jQuery的datetimepicker插件

    因为后台系统要使用年月日时分的设置,又因为使用的Bootstrap框架只有datepicker和timepicker控件.所以在jQuery库中找到轻量级的datetimepicker插件,很好地解决 ...

  5. UIPageViewController看这篇就够了

    先说初始化 - (UIPageViewController *)PageViewController{ if(!_PageViewController){ //书脊位置,只有在UIPageViewCo ...

  6. egrep 或与

    ' HEADERABC' .txt | .txt 'HEADERABC' .txt > .txt .txt > .txt ' HEADERABC' ' TAILER123' .txt &g ...

  7. cmake 支持-lpthread

    set(CMAKE_BUILD_TYPE "Release") if( CMAKE_BUILD_TYPE STREQUAL "Debug" )    set(C ...

  8. Dockfile中的命令如何在.sh中执行

    有类似如下内容的Dokefile文件.1 RUN cd /tmp/patch \ && /lib/python3./site-packages/moduleA/a.* \ && ...

  9. Oracle使用——PLSQL的中文乱码显示全是问号--Oracle查询中文乱码

      问题 这两天刚将PLSQL与Oracle配置好,可是在PLSQL中插入数据时,出现一个问题,PLSQL中的表里无法显示中文,中文无法保存.无法输出,中文在表中显示问号,如图: 原因 经过一番查证, ...

  10. 第一类和第二类Stirling数

    做了老是忘…… 实际问题: 找维基百科.百度百科…… 第一类Stirling数 n个元素构成m个圆排列 S(n,m)=S(n-1,m-1)+(n-1)*S(n-1,m) 初始 S(0,0)=1 S(n ...