2011-10-19 1 views
1

UDP 멀티 캐스트 패킷이 여러 스레드에서 처리되는 까다로운 문제를 추적하는 권장 사항이 있는지 궁금합니다.UDP 멀티 캐스트 및 다중 스레드를 처리 할 때 간헐적 인 문제를 추적하는 기술?

  • 이 문제는 프로그램 시작시 1 초 이내에 발생합니다. 따라서 문제가 발생한 시간대를 알 수 있습니다.
  • 약 20 회 실행 한 번만 문제가 발생합니다. 나머지 19 번은 완벽하게 작동합니다.
  • 프로그램에서 UDP 멀티 캐스트 패킷을 데이터 패킷으로 리 어셈블하는 중입니다. 문제가 발생하면 데이터 패킷의 내용이 잘못되었습니다 (CRC로 확인할 수 있음).

네트워크 UDP 패킷과 관련된 다중 스레드 환경에서 버그를 추적하는 데 사용할 수있는 디버깅 기술이 .NET에 있습니까?

어떻게 이러한 환경에서 가시성을 얻을 수 있습니까?

답변

3

자세한 정보가 없으면 구체적인 권장 사항을 제시 할 수 없습니다. 나는 다음과 같이 시작할 것입니다.

내가 할 수있는 첫 번째 일은 코드에서 가능한 경쟁 조건이 패킷을 집계하고 다시 어셈블하는지 확인하는 것입니다. 어쨌든, 당신은 여러 스레드에서 패킷을 가져 와서 결합하고 있습니다. 일반적으로이 작업은 두 가지 방법 중 하나로 수행됩니다. 개별 스레드가 전용 스레드 (다중 생성자, 단일 소비자 설계)로 처리하기 위해 패킷을 대기 시키거나 스레드가 버퍼를 공유 할 수있게하는 일종의 동기화를 사용합니다. 즉, 각 스레드는 들어오는 패킷을 결합 된 패킷에 추가합니다.

전자는 쉽게 제어 할 수 있습니다. 동시 대기열 (예 : .NET BlockingCollection)을 사용할 수 있으며 동기화는 걱정하지 않아도됩니다. 잠금 장치가있는 Queue<T>을 사용하고 있거나 개별 스레드가 패킷을 결합하기 위해 협력하고 있다면 동기화에 구멍이 없는지 확인해야합니다.

또 다른 가능성은 들어오는 패킷 중 하나 이상이 어떤 식 으로든 손상되었거나 판독기가 올바르게 읽지 못하는 것입니다. 들어오는 모든 패킷을 스레드 번호와 패킷이 들어온 시간과 함께 기록해야합니다. 문제가 발생하면 로그를 검사하여 패킷의 상태가 양호한 지 확인할 수 있습니다. 그렇다면 문제는 거의 확실하게 동기화됩니다.

특정 응용 프로그램에 대한 추가 정보가 없으면 다른 권장 사항이 없습니다.

+0

결국 문제를 추적했습니다. 코드는 스레드와 관련이 없으며 코드의 다른 부분과 관련이 있습니다 (시퀀스 번호의 갭을 잘못 처리 한 경우 정확함). 모든 코드가 스레드로부터 안전하다는 것을 알기 전까지는 손을 댈 수있는 모든 것에 임시 잠금()을 배치하여 스레딩의 잠재적 문제를 해결했습니다. 귀하의 답변을 주셔서 감사합니다, 그것은 내가 문제의 한 원인을 제거하는 데 도움이. – Contango