문제

따라서 원격 컴퓨터에서 명령 승인을 관리하는이 코드가 있습니다. 때로는 14 일에 한 번 같은 등에 다음 줄에 Null 참조 예외가 발생합니다.

computer.ProcessCommandAcknowledgment( commandType );

정말로 나에게 버그가있는 것은 내가 그 전에 널 참조를 확인한다는 것입니다. 아니요 무슨 일이 일어나고 있는지 아이디어. 다음은 그 가치에 대한 전체 방법입니다.

    public static void __CommandAck( PacketReader reader, SocketContext context )
    {
        string commandAck = reader.ReadString();

        Type commandType = Type.GetType( commandAck );

        Computer computer = context.Client as Computer;

        if (computer == null)
        {
            Console.WriteLine("Client already disposed. Couldn't complete operation");
        }
        else
        {
            computer.ProcessCommandAcknowledgment( commandType );
        }
    }

단서가 있습니까?

편집 : ProcessCommandackNowledgment :

    public void ProcessCommandAcknowledgment( Type ackType )
    {
        if( m_CurrentCommand.GetType() == ackType )
        {
            m_CurrentCommand.Finish();
        }
    }
도움이 되었습니까?

해결책

다른 스레드는 무엇을하고 있습니까?

편집 : 서버가 단일 스레드라고 언급하지만 다른 의견은 이 부분 단일 스레드입니다. 이 경우에도 동시성 문제가있을 수 있습니다.

결론은 여기서 다중 스레드 문제 나 CLR 버그가 있다는 것입니다. 내가 더 가능성이 높은 것을 추측 할 수 있습니다.

다른 팁

당신이 준 정보를 바탕으로, 그 위치에서 널 심판이 발생하는 것은 확실히 불가능 해 보입니다. 다음 질문은 "특정 라인이 NullReferenceException을 생성한다는 것을 어떻게 알 수 있습니까?"입니다. 디버거 또는 스택 추적 정보를 사용하고 있습니까? 코드의 소매 또는 디버그 버전을 확인하고 있습니까?

디버거 인 경우 기본적으로 디버거를 유발할 수있는 다양한 설정 조합 나타나다 Nullref를 다른 장소에서보고합니다. 그 일에 대한 메인은 단지 내 코드 설정입니다.

내 경험상, 나는 실제로 예외가 발생하는 줄을 결정하는 가장 신뢰할 수있는 방법을 찾았습니다.

  1. JMC를 끕니다
  2. 디버그로 컴파일하십시오
  3. Debugger-> 설정 -> Throw CLR 예외를 중단하십시오.
  4. 디버거 창에서 스택 트레이스 속성을 확인하십시오

나는 당신의 TCP 프레임 코드에 문제가 있다고 돈을 내기 할 것입니다 (당신이 있으면!)

"PacketReader"는 아마도 당신이 그렇지 않다고 제안합니다. 기술적으로는 "FrameReader"라고 불리우거나 그렇다면 비슷한 것입니다.

관련된 두 PC가 로컬 LAN 또는 무언가에 있으면 14 일 간격을 설명 할 것입니다. 인터넷을 통해 이것을 시도하면 특히 WAN 대역폭이 제기 된 경우 오류 빈도가 훨씬 더 일반적 일 것입니다.

가능합니까? ReadString() 귀환이 널입니까? 이로 인해 GetType가 실패하게됩니다. 아마도 빈 패킷을 받았을까요? 또는 문자열은 유형과 일치하지 않을 수 있으므로 나중에 사용하면 명령 유형이 널이됩니다.

편집하다: 당신은 그것을 확인 했습니까? m_CurrentCommand 호출 할 때 무효가되지 않습니다 ProcessCommandAcknowledgment?

최적화가 켜져 있다면 실제로 발생하는 매우 잘못된 장소를 가리킬 수 있습니다.

몇 년 전에 나에게 비슷한 일이 일어났습니다.

또는 그렇지 않으면 컨텍스트가 다른 스레드에 의해 널로 설정되는 곳 어딘가에있는 스레드 경주. 그것은 또한 오류의 드문 일을 설명 할 것입니다.

좋아요, 정말 몇 가지 가능성 일뿐입니다.

  1. 어떻게 든 당신의 컴퓨터 참조는 당신이 그 루틴이라고 부를 때까지 곤경에 처해 있습니다.

  2. 통화중인 무언가가 Null 포인터 Dereference 오류를 던지고 있지만 해당 라인에서 감지됩니다.

그것을보고, 나는 스택이 부패하고있는 매우 의심스럽고 당신의 computer 엉망이되는 자동. 서브 루틴/방법/기능 호출을 확인하십시오 주위에 당신이 문제가있는 사람; 특히, "컴퓨터"항목으로 만드는 것이 실제로 예상되는 유형인지 확인하십시오.

computer.processcommandacknowledgment (commandType);

이것에 들어갈 수있는 디버깅 기호가 있습니까?

NULL Ref 예외는 ProcessCommandackNowledgement에 의해 던져 질 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top