C# C和vs2008中的线程调试

C# C和vs2008中的线程调试,c#,visual-studio-2008,multithreading,debugging,C#,Visual Studio 2008,Multithreading,Debugging,我有一个相当严重的多线程调试问题。我在与串行设备交互时遇到了一些计时问题,我需要跟踪它。我有三条线索: UI更新的主线程。用户可以通过选择预设来更改设备的一个参数,也可以同时更改多个参数。 状态检查线程,用于查询以确保设备仍处于连接状态。如果用户关闭设备或设备本身以有趣的方式进行交互,则状态更改需要反映在UI中。 读取设备响应的串行端口的线程。 我的问题实际上与调试这种情况有关。似乎每个线程中的每一行都必须有一个断点才能调试;如果我中断一个线程,调试器将不会单步执行该线程。我知道其他线程将继续更

我有一个相当严重的多线程调试问题。我在与串行设备交互时遇到了一些计时问题,我需要跟踪它。我有三条线索:

UI更新的主线程。用户可以通过选择预设来更改设备的一个参数,也可以同时更改多个参数。 状态检查线程,用于查询以确保设备仍处于连接状态。如果用户关闭设备或设备本身以有趣的方式进行交互,则状态更改需要反映在UI中。 读取设备响应的串行端口的线程。 我的问题实际上与调试这种情况有关。似乎每个线程中的每一行都必须有一个断点才能调试;如果我中断一个线程,调试器将不会单步执行该线程。我知道其他线程将继续更新,但我所在的线程是否应该像调试器中的正常线程一样执行,即从一行执行到下一行?然后,我可以使用“线程”选项卡在线程之间切换


我提到我在WPF,因为我不知道这是否会改变现状;也许有,也许没有。状态检查线程是UI控件的一部分,因为只有在UI启动时才需要检查状态。该控件位于与主应用程序不同的库中。

当调试器在断点上停止时,默认情况下它将挂起所有其他线程。但当您单步执行或继续时,所有3个线程都将恢复。当您单步执行代码时,调试器基本上会在下一行设置一个临时断点,并恢复所有线程。另外两个可能在达到虚拟断点之前有机会跑步

您可以在调试时冻结其他线程


当您处于断点时,选择调试|窗口|线程。选择您不感兴趣的线程,然后单击鼠标右键,选择“冻结”。这将使您能够专注于正在执行的一个线程。

如果您的代码以一种奇怪的方式单步执行,它有时可能是由一个简单的pdb文件损坏引起的。对代码进行全面的重新生成将从头开始重新生成代码,并修复任何此类故障

要记住的另一件事是,在调试器中停止一个线程可能会导致各种不寻常的计时,这在发布版本中是看不到的。例如:

当您在断点上停止时,串行端口将始终在硬件/驱动程序级别上继续运行-当您下一次尝试单步执行代码时,它可能会突然接收到大量数据。对于异步回调,这可能很有趣

停止一个线程会干扰正常的时间选择,因此线程到线程的同步可能会出错


我和杰森在一起,我再也不会说实话了

最好使用一种方法检测每一行代码,该方法还使用Interlocked.Increment递增计数器,并将计数器添加到本地文件的输出中

需要计数器,因为实际事件的顺序并不总是与写入文件的顺序相同。命名线程或在输出中使用ID值。我使用MS Excel打开文件并根据线程为所有行着色,这样我可以非常清楚地看到交错操作

我甚至编写了一个包装器来锁定{}在每个锁打开/关闭时插入哪些仪器

同步问题对于t-shoot来说是可怕的,所以我建议不要花费比重构更多的钱。有时这表明你所采取的方法是次优的


请记住在必要的情况下使用volatile与IO。

删除了WPF引用,因为它与WPF没有真正的关系-只是一般的MT调试。不幸的是,我注意到vs2008已经开始非常非常奇怪地运行这只是一个问题行为,另一些则与源代码管理和自项目迁移到WPF以来发生的不同构建设置有关。因此包含,以防万一。但我的观点是,它没有达到那个临时断点;它只是愉快地继续前进,除了原来的断点之外,没有其他断点。我希望其他线程正在运行;我希望能够看到他们的不当行为。当你在步进后手动断开时会发生什么?它是在某个Win32方法中丢失的,还是在代码中的某个时候实际停止了?它从来没有停止过,只是一直在继续。听起来你已经安装了一个hosed VS。尝试从另一台计算机运行,以查看是否显示相同的行为。