首页 > 断点会影响程序运行结果吗?

断点会影响程序运行结果吗?

Windows 10,使用Visual Studio 2015 Community 编写C#程序(.net 4.6.1)时遇到了添加断点前后程序行为不一致的问题:断点类型为操作断点且设置了触发后继续执行,对应操作为将一个自定义类型的实例所表示的字符串输出到输出窗口,代码如下:

//新用户连接
Announce(new Message("SERVER", "USER_LOGIN", _newUser.ToString()));
//断点在此处:将_newUser.ToString()输出到输出窗口
SendMessage(
    new Message("SERVER", "LOGIN_SUCCESS", _newUser.ID.ToString()),
    _clientSocketList[_newUser.ID]
    );

其中Announce函数作用是向所有已连接的客户端发送一个消息,SendMessage函数作用是向指定客户端发送一个消息。
断点加在SendMessage处,如果不加断点,新连接的这个客户端可以收到前一条"USER_LOGIN"消息但无法收到后一条“LOGIN_SUCCESS”消息;若加了断点则两条消息可以正常收到。请问可能是由什么原因引起的?


从你这段程序无法判定错误的原因,断点只是表现出了程序的的问题,而不是问题本身。
从逻辑而言,断点本身不改变程序的运行。但是有时候程序的行为会因为一些环境因素的不同而变化。多线程间的时序是最常见的。还有很多其它情况:
比如消息很傻很天真的用毫秒数做主键,两句执行非常近的语句因为ID重复结果只留下一个。加断点使时间间隔稍长避免了重复。
又如看起来顺序执行的操作可能是异步的,而当前看来可用的对象到了真正异步执行点时已经缺少了必要的执行环境,最常见的是数据库事务已经关闭。加断点输出时,在主流程执行输出调试信息时把需要的值缓存在了对象中。
还有比如对内存没有越界检查的程序语言中,断点输出的语句恰好分配了相邻内存避免了本来会越界出错的语句。
总之这类错误都是比较难调试的,需要对程序确切的执行时序和状态有清楚的了解。
反过来说,这类问题的根本原因就是由于写代码的人没有清楚的理解这些问题,写出了一些看起来正确,但是其实是依赖于某些偶然条件的代码。


断点并不会影响程序运行。

【热门文章】
【热门文章】