Domanda

Quindi io ho questo codice che si prende cura di comando di riconoscimento da computer remoti, a volte (come una volta in 14 giorni o qualcosa del genere) la seguente riga genera un'eccezione di riferimento null:

computer.ProcessCommandAcknowledgment( commandType );

Ciò che veramente mi bug è che io verificare la presenza di un riferimento null prima di esso, quindi non ho non idea che cosa sta succedendo. Ecco il metodo integrale per quello che il suo valore:

    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 );
        }
    }

Eventuali indizi?

Modifica: ProcessCommandAcknowledgment:

    public void ProcessCommandAcknowledgment( Type ackType )
    {
        if( m_CurrentCommand.GetType() == ackType )
        {
            m_CurrentCommand.Finish();
        }
    }
È stato utile?

Soluzione

Quali sono l'altro thread (s) fare?

Modifica: Lei ha accennato che il server è a thread singolo, ma un altro commento suggerisce che questa porzione è a thread singolo. Se questo è il caso, si potrebbe ancora avere problemi di concorrenza.

Linea di fondo qui, credo, è che hai un problema di multi-thread o un bug CLR. Si può intuire che credo sia più probabile.

Altri suggerimenti

In base alle informazioni che hai dato, certamente appare impossibile per un ref nulla a verificarsi in quella posizione. Così la prossima domanda è: "Come fai a sapere che la particolare linea sta creando il NullReferenceException?" Si sta utilizzando le informazioni di debug o traccia dello stack? Stai controllando una versione di vendita al dettaglio o di debug del codice?

Se è il debugger, varie combinazioni di impostazioni che possono essenzialmente provocare il debugger a visualizzato per segnalare il NullRef in un posto diverso. Il principale che avrebbe fatto che è l'impostazione Just My Code.

Nella mia esperienza, ho trovato il modo più affidabile per determinare la linea di un'eccezione in realtà si verifica è quello di ...

  1. Spegnere JMC
  2. Compila con Debug
  3. Debugger -> Impostazioni -.> Interruzione sulle eccezioni tiro CLR
  4. Controllare la proprietà StackTrace nella finestra del debugger

Vorrei scommettere denaro che c'è un problema con il codice di inquadratura TCP (se avete qualsiasi!)

"PacketReader", forse suggerisce che non lo fanno. Perché, tecnicamente, sarebbe chiamato "FrameReader" o qualcosa di simile, se hai fatto.

Se i due è coinvolto PC sono su un LAN locale o di qualcosa, allora sarebbe probabilmente spiegare l'intervallo di 14 giorni. Se si è tentato questa via Internet Scommetto che la frequenza di errore sarebbe molto più comune, soprattutto se la larghezza di banda della WAN è stato sostenuto.

E 'possibile che ReadString() sta tornando nulla? Ciò causerebbe GetType al sicuro. Forse hai ricevuto un pacchetto vuoto? In alternativa, la stringa può non corrisponde un tipo e quindi CommandType sarebbe nulla quando utilizzati in seguito.

Modifica : Hai controllato che m_CurrentCommand non è nullo quando si richiama ProcessCommandAcknowledgment?

Se avete ottimizzazioni acceso, è probabile che si punta ad un posto molto sbagliato dove effettivamente avviene.

Qualcosa di simile è successo a me qualche anno fa.

Oppure una possibile corsa filo da qualche parte dove contesto viene impostata su null da un altro thread. Ciò spiegherebbe anche l'uncommonness dell'errore.

D'accordo, ther sono in realtà solo alcune possibilità.

  1. In qualche modo il vostro riferimento computer viene svasata per il momento si chiama quella routine.

  2. Qualcosa sotto la chiamata sta gettando l'errore puntatore nullo ma è stata rilevata in quella riga.

Guardando la cosa, io sono molto diffidente lo stack è sempre danneggiato, causando il computer automatica per ottenere alterati. Controllare il / metodo / funzione di subroutine chiamate intorno quello che hanno problemi con; in particolare, verificare che cosa si sta facendo in una voce "Computer" è davvero il tipo che ci si aspetta.

  

computer.ProcessCommandAcknowledgment (CommandType);

Hai simboli di debug per essere in grado di entrare in questo?

L'eccezione ref nulla potrebbe essere gettato da ProcessCommandAcknowledgement, e bolla.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top