VisualStduio 打断点调试和不打断点调试有什么区别 随机数

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

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

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

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


本文会经常更新,请阅读原文: https://lindexi.gitee.io/lindexi/post/VisualStduio-%E6%89%93%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95%E5%92%8C%E4%B8%8D%E6%89%93%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据派THU

独家 | 教你用Scrapy建立你自己的数据集(附视频)

原文标题:Using Scrapy to Build your Own Dataset 作者:Michael Galarnyk 翻译:李清扬 全文校对:丁楠雅...

24080
来自专栏Java后端技术栈

你应该知道的缓存进化史!

本文是上周去技术沙龙听了一下爱奇艺的Java缓存之路有感写出来的。先简单介绍一下爱奇艺的java缓存道路的发展吧。

15010
来自专栏更流畅、简洁的软件开发方式

【自然框架】之数据访问 —— 再小的类库也需要设计。

  以前也写过几篇关于数据访问的,这里是最新的总结。麻雀虽小五脏俱全,数据访问也许不起眼,但是也要好好的设计一翻。从2004年开始用自己的数据访问,一直到现在,...

25990
来自专栏北京马哥教育

一致性hash原理与实现

一、背景介绍 memcached的分布式 memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。服务器端内存存储功能,其实现非常简单。...

39670
来自专栏GopherCoder

『Go 语言学习专栏』-- 第十一期

15430
来自专栏有趣的django

CRM客户关系管理系统(二) 第三章、前端页面设计

55300
来自专栏Crossin的编程教室

Python 爬虫爬取美剧网站

一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前...

43470
来自专栏拂晓风起

【HTTP劫持和DNS劫持】实际JS对抗

37020
来自专栏IT派

美剧迷是如何使用Python的

一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前...

12920
来自专栏铭毅天下

干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践

1、题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的【樊登读书会】、得到的每天听本...

2.1K60

扫码关注云+社区

领取腾讯云代金券