在处理UDP多播和多线程时跟踪间歇性问题的技术?

时间:2011-10-19 16:10:19

标签: c# .net debugging udp multicast

我想知道您是否有任何建议可以追踪涉及由多个线程处理的UDP多播数据包的棘手问题。

  • 程序启动时,启动后1秒内始终出现问题。所以,我知道问题发生的时间窗口。
  • 问题仅在程序的大约20次运行中发生一次。另外19次运行,它完美无瑕。
  • 程序将UDP组播数据包重组为数据包,如果出现问题,则数据包内容格式不正确(可以通过CRC检查)。

.NET中是否有任何调试技术可用于跟踪涉及网络UDP数据包的多线程环境中的错误?

如何在这样的环境中获得知名度?

1 个答案:

答案 0 :(得分:3)

如果没有更多信息,我无法提供具体建议。我从以下开始。

我要做的第一件事是检查代码中是否存在聚合和重新组装数据包的可能竞争条件。不知何故,你从多个线程中获取数据包并将它们组合在一起。通常,这可以通过以下两种方式之一完成:单个线程将数据包排队以供专用线程(多生产者,单一消费者设计)处理,或者使用某种允许线程共享缓冲区的同步。也就是说,每个线程将其传入的数据包添加到组合数据包中。

前者更容易控制。您可以使用并发队列(例如.NET BlockingCollection)而不用担心同步。如果您使用带有锁的Queue<T>,或者您的各个线程正在合作组合数据包,则必须确保同步中没有任何漏洞。

另一种可能性是一个或多个传入的数据包以某种方式损坏,或者读者没有正确读取它。您应该记录每个传入的数据包以及线程编号及其进入的时间。当问题突然出现时,您可以检查日志以查看数据包是否处于良好状态。如果是,那么问题几乎可以肯定是你的同步。

如果没有关于您的具体申请的更多信息,我没有任何其他建议。