C#和vs2008中的线程调试

mmr*_*mmr 5 c# debugging multithreading visual-studio-2008

我有一个非常严重的多线程调试问题.在与串行设备交互时我遇到了某种时序问题,我需要跟踪它.我有三个主题:

  1. UI更新的主要线程.用户可以通过选择预设来更改设备的一个参数,或者一次更改多个参数.
  2. 查询以确保设备仍然连接的状态检查线程.如果用户关闭设备或设备本身以有趣的方式与之交互,则状态更改需要反映在UI中.
  3. 读取设备响应的串行端口的线程.

我的问题实际上与调试这种情况有关.看起来我在每个线程中的每一行都必须有一个断点才能进行调试; 如果我在一个线程中断,调试器将不会单步执行该线程.我知道其他线程将继续更新,但是我不应该在调试器中执行正常的线程,即从一行到下一行?然后,我可以使用'threads'选项卡在线程之间切换.

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

Pau*_*der 7

当调试器在断点上停止时,默认情况下它将挂起所有其他线程.但是当你继续步骤或继续时,所有3个线程都会恢复.当您单步执行代码时,调试器基本上会在下一行设置临时断点并恢复所有线程.其他2可能有机会在该虚拟断点被击中之前运行.

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

当你在断点处时选择Debug | Windows | 线程.选择您不感兴趣的主题并右键单击,选择" 冻结".这将让您专注于您正在逐步完成的一个主题.


Jas*_*ams 1

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

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

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

  • 停止一个线程会扰乱正常的时间切片,从而导致线程与线程的同步可能会被搞砸。