Visual Studio 调试断点冻结应用

Posted

技术标签:

【中文标题】Visual Studio 调试断点冻结应用【英文标题】:Visual Studio debug break points freezing app 【发布时间】:2013-06-13 04:03:47 【问题描述】:

我在代码中添加了几个断点来监控两个变量的值。该应用程序基本上从以 500 Hz 工作的微控制器生成的串行端口接收 9600 波特的数据流,并且必须根据某些规则“if”和“if else”过滤消息以去除标题字符并将它们寻址到计算使用的其他变量。 代码如下:

 class Stripper

 public  void  Distri (string inComing, out string param1, out string param2, out string param3, out string param4)
    
        string currentRes="";
        string currentMot = "";
        string temperature="";
        string numRPM="";
        string f = inComing;
        if (inComing.Length < 6)
        
            f = ">123456<";
        
        char firstChar = f[0];
        char lastChar = f[f.Length - 2];
        bool test1 =(firstChar.Equals('>'));
        bool test2 =(lastChar.Equals('<'));
        int messLenght = f.Length;

        try
        
            if (test1 == true && test2 == true && messLenght <= 10)
            
                f = f.Replace("<", "");
                f = f.Replace(">", "");

                if (f[0] == 'I')
                
                    string _currentRes = f;
                    _currentRes = _currentRes.Replace("I", "");
                    currentRes = _currentRes;
                

                else if (f[0] == 'M')
                
                    string _currentMot = f;
                    _currentMot = _currentMot.Replace("M", "");
                    currentMot = _currentMot;
                

                else if (f[0] == 'T')
                
                    string _temperature = f;
                    _temperature = _temperature.Replace("T", "");
                    temperature = _temperature;
                
                else if (f[0] == 'N')
                
                    string _numRPM = f;
                    _numRPM = _numRPM.Replace("N", "");
                    numRPM = _numRPM;
                

                else
                 
            

            else
             
        
        catch (System.Exception)
        

            throw;
        

        param1 = currentRes;
        param2 = temperature;
        param3 = numRPM;
        param4 = currentMot;

        
       
      

我面临的问题很奇怪,在某些时候我完全迷失了。基本上,在变量“f”和“inComing”上的断点处于活动状态时,应用程序立即无响应,为了使其工作,我不得不将流的速度从串行降低到 1/100,从而引入延迟。如果没有断点,应用程序可以毫无问题地获取完整的数据流。也许这种经历也可以帮助其他处于类似情况的人。 看起来断点大大减慢了这个过程。我认为这与我使用的电脑无关,因为这是一个具有 16 Gb RAM 和 2.4 Ghz 处理器 i5 的怪物。 我想知道为什么会发生这种情况,是否有办法避免这种问题而不是不使用断点?

【问题讨论】:

你可以创建一个日志文件来替代断点 感谢您的建议。这肯定是一个很好的选择,但不能实时了解正在发生的事情。不过,我之前没有考虑过,我会尝试的。 你也可以在 VS 中写入你的输出窗口,但我不知道该怎么做,我现在你可以做到 :D Trace.TraceInformation? 贴出的代码不太可能与问题有关。典型问题是使用 DataReceived 事件并过于频繁地调用 Begin/Invoke。用调用请求打击 UI 线程,并在它无法跟上并停止绘制和响应用户输入时使其变得紧张。您可以通过让 DataReceived 事件做更多工作来解决这个问题,在调用之前收集整个设备响应。忽略 SerialPort.Read() 返回值也是一个典型的错误。这些在 sn-p 中都不可见。 【参考方案1】:

我通过快速搜索找到了它Debug.WriteLine() 是写到你的 VS 输出窗口的东西

这样你就可以得到你的实时值

另见link

【讨论】:

谢谢。非常感谢,但我仍然不明白为什么断点会导致这样的问题。 可能基于它的“正常”使用,因此它可能会尝试通过反射获取值的所有信息(但我不知道)

以上是关于Visual Studio 调试断点冻结应用的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 断点仅适用于第二次调试尝试

Visual Studio 远程调试中未命中断点

Visual Studio调试之断点技巧篇

断点无法通过 Windows 10 和 WSL2 上的 Visual Studio Code 在 Chrome 中调试 React 应用程序

Visual Studio调试之断点技巧篇补遗

Visual Studio调试之断点进阶篇