Merkwürdiger aber reproduzierbarer Fehler im Debugger

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Merkwürdiger aber reproduzierbarer Fehler im Debugger

Beitrag von MVXA »

Hi,
ich hab bei Versuchen mit dem ICQ Protokoll einen
sehr interessanten Bug im Debugger gefunden. Der
ist mir schon öfters übern Weg gelaufen, könnte diesen
aber nicht reproduzieren. Jetzt ist es mir gelungen den
Bug in einem recht kleinen Source zu reproduzieren.
Sobald man in der Funktion FLAP_ReadSocket() die
Variable Deklaration raus wirft, funktioniert alles wieder.
Mit der Deklaration bleibt der Debugger beim Aufruf der
Funktion einfach stehen.

Code: Alles auswählen

    Enumeration 1
        #FLAP_CHANNEL_NEW_CONNECTION_NEGOTIATION
        #FLAP_CHANNEL_SNAC_DATA
        #FLAP_CHANNEL_FLAP_LEVEL_ERROR
        #FLAP_CHANNEL_CLOSE_CONNECTION_NEGOTIATION
        #FLAP_CHANNEL_KEEP_ALIVE
    EndEnumeration
    
    #FLAP_MAGIC = $2A
    
    Structure sFLAP
        bFlapID.b
        bChannel.b
        wSeqID.w
        
        wBufLen.w
        bBuffer.b[$FFFF]
    EndStructure
    
    Global NewList llFLAPs.sFLAP()

IncludeFile "modFnkDec.pb"

EnableExplicit
Procedure FLAP_NewPaket(bChannel.b = #FLAP_CHANNEL_SNAC_DATA)
        LastElement(llFLAPs())
        If AddElement(llFLAPs())
            With llFLAPs()
                \bFlapID  = #FLAP_MAGIC
                \bChannel = bChannel
                \wBufLen  = 6

                ProcedureReturn @llFLAPs()
            EndWith
        
        Else
            ProcedureReturn #False
        EndIf
    EndProcedure
    
    Procedure FLAP_ReadSocket(*pPaket.sFLAP, lSocket.l)
        Protected tPaket.sFLAP
        
        If *pPaket And lSocket
;             If ReceiveNetworkData(lSocket, @tPaket\bBuffer, 6)
;                 CallDebugger
;                 
;                 With *pPaket
;                     \wBufLen = 0
;                     
;                     If FLAP_ReadByte(*pPaket) <> #FLAP_MAGIC
;                         ProcedureReturn #False
;                         
;                     Else
;                         \bFlapID    = #FLAP_MAGIC
;                         \bChannel   = FLAP_ReadByte(*pPaket): Debug \bChannel
;                         \wSeqID     = FLAP_ReadWord(*pPaket): Debug \wSeqID
;                         \wBufLen    = FLAP_ReadWord(*pPaket): Debug \wBufLen
;                         
;                         CallDebugger
;                     
;                         ReceiveNetworkData(lSocket, @\bBuffer, \wBufLen)
;                         
;                         ProcedureReturn \wSeqID&$FFFF
;                     EndIf
;                 EndWith
;             EndIf
            
        Else
            ProcedureReturn #False
        EndIf
    EndProcedure
    
    Procedure FLAP_WriteSocket(*pPaket.sFLAP, lSocket.l)
        Protected wBufLen.w: Static wSequenceID.w
        
        If *pPaket And lSocket
            wSequenceID + 1
        
            With *pPaket
                wBufLen = \wBufLen: Debug wBufLen
                \wSeqID = wSequenceID - 1
                \wBufLen = 0
                
                FLAP_AddByte(*pPaket, #FLAP_MAGIC)
                FLAP_AddByte(*pPaket, \bChannel)
                
                FLAP_AddWord(*pPaket, \wSeqID)
                FLAP_AddWord(*pPaket, wBufLen - 7)
                \wBufLen = wBufLen
                
                SendNetworkData(lSocket, @\bBuffer, wBufLen - 1)
            EndWith
            
            ProcedureReturn #True
            
        Else
            ProcedureReturn #False
        EndIf
    EndProcedure 
    
    Procedure FLAP_DumpToFile(*pPaket.sFLAP, sDateiName.s)
        Protected lFileID.l, wBufLen.w
        
        If *pPaket And sDateiName
            lFileID = CreateFile(#PB_Any, sDateiName)
            If Not lFileID
                ProcedureReturn #False
                
            Else
                With *pPaket
                    wBufLen  = \wBufLen
                    \wBufLen = 0
                    
                    FLAP_AddByte(*pPaket, \bFlapID)
                    FLAP_AddByte(*pPaket, \bChannel)
                    
                    FLAP_AddWord(*pPaket, \wSeqID)
                    FLAP_AddWord(*pPaket, wBufLen - 6)
                    \wBufLen = wBufLen
                    
                    WriteData(lFileID, @\bBuffer, wBufLen)
                EndWith
                
                CloseFile(lFileID)
                ProcedureReturn #True
            EndIf
            
        Else
            ProcedureReturn #False
        EndIf
    EndProcedure
    
;- FLAP Write
    Procedure FLAP_AddByte(*pPaket.sFLAP, lValue.l)
        Protected *pAddr.Byte
        
        If *pPaket
            With *pPaket
                \bBuffer[\wBufLen] = lValue&$FF
                \wBufLen + 1
                
                ProcedureReturn @\bBuffer[\wBufLen - 1]
            EndWith
            
        Else
            ProcedureReturn #False
        EndIf
    EndProcedure
    
    Procedure FLAP_AddWord(*pPaket.sFLAP, lValue.l)
        Protected *pAddr.Byte
        
        If *pPaket
            With *pPaket
                \bBuffer[\wBufLen] = (lValue&$FF00) >> 8: \wBufLen + 1
                \bBuffer[\wBufLen] = (lValue&$00FF)     : \wBufLen + 1
                
                ProcedureReturn @\bBuffer[\wBufLen - 2]
            EndWith
            
        Else
            ProcedureReturn #False
        EndIf
    EndProcedure
    
    Procedure FLAP_AddLong(*pPaket.sFLAP, lValue.l)
        Protected *pAddr.Byte
        
        If *pPaket
            With *pPaket
                \bBuffer[\wBufLen] = (lValue&$FF000000) >> 24: \wBufLen + 1
                \bBuffer[\wBufLen] = (lValue&$00FF0000) >> 16: \wBufLen + 1
                \bBuffer[\wBufLen] = (lValue&$0000FF00) >>  8: \wBufLen + 1
                \bBuffer[\wBufLen] = (lValue&$000000FF)      : \wBufLen + 1
                
                ProcedureReturn @\bBuffer[\wBufLen - 4]
            EndWith
            
        Else
            ProcedureReturn #False
        EndIf
    EndProcedure
    
    Procedure FLAP_AddBuffer(*pPaket.sFLAP, *pBuffer.Byte, lLength.l)
        Protected *pAddr.Byte
        
        If *pPaket
            With *pPaket
                While lLength
                    \bBuffer[\wBufLen] = *pBuffer\b&$FF
                    lLength - 1: \wBufLen + 1: *pBuffer + 1
                Wend
                
                ProcedureReturn #True
            EndWith
            
        Else
            ProcedureReturn #False
        EndIf
    EndProcedure
    
;- FLAP - TLV
    Procedure FLAP_AddTLV(*pPaket.sFLAP, wType.w, wLen.w, *pBuffer.Byte)
        FLAP_AddWord(*pPaket, wType)
        FLAP_AddWord(*pPaket, wLen)
        FLAP_AddBuffer(*pPaket, *pBuffer, wLen)
    EndProcedure
    
    Procedure FLAP_AddTLV_String(*pPaket.sFLAP, wType.w, sString.s)
        Protected lLen.l
        
        lLen = Len(sString)&$FFFF
        FLAP_AddWord(*pPaket, wType)
        FLAP_AddWord(*pPaket, lLen)
        FLAP_AddBuffer(*pPaket, @sString, lLen)
    EndProcedure
    
    Procedure FLAP_AddTLV_Word(*pPaket.sFLAP, wType.w, lValue.l)
        FLAP_AddWord(*pPaket, wType)
        FLAP_AddWord(*pPaket, 2)
        FLAP_AddWord(*pPaket, lValue)
    EndProcedure
    
    Procedure FLAP_AddTLV_Long(*pPaket.sFLAP, wType.w, lValue.l)
        FLAP_AddWord(*pPaket, wType)
        FLAP_AddWord(*pPaket, 4)
        FLAP_AddLong(*pPaket, lValue)
    EndProcedure
    
;- SNAC
    Procedure SNAC_AddHeader(*pPaket.sFLAP, wService.w, wSubType.w, wFlags.w)
        Protected wSeq.w
        
        If *pPaket
            wSeq = (*pPaket&$FFFF) & $7FFF
        
            FLAP_AddWord(*pPaket, wService)
            FLAP_AddWord(*pPaket, wSubType)
            FLAP_AddWord(*pPaket, wFlags)
        
            FLAP_AddWord(*pPaket, wSeq)
            FLAP_AddWord(*pPaket, (*pPaket >> $10)&$FFFF)
        Else
            ProcedureReturn #False
        EndIf
    EndProcedure
DisableExplicit

InitNetwork()

lSocket = OpenNetworkConnection("login.icq.com", 5190)
If lSocket
    FLAP = FLAP_NewPaket()
    FLAP_AddWord(FLAP, $17)
    FLAP_AddWord(FLAP, $06)
    FLAP_AddWord(FLAP, $00)
    FLAP_AddLong(FLAP, FLAP)
    
    FLAP_AddTLV_String(FLAP, $01, "313758929")
    FLAP_AddWord(FLAP, $4B): FLAP_AddWord(FLAP, $00)

    FLAP_WriteSocket(FLAP, lSocket)
    FLAP_DumpToFile(FLAP, "Dump.dmp")
    
    Repeat
        If NetworkClientEvent(lSocket) <> 2
            Delay(1)
            
        Else
            MessageRequester("data", "new data")
            *pPaketNew.sFLAP = FLAP_NewPaket()
            
            Debug FLAP_ReadSocket(*pPaketNew, lSocket)
            
            DeleteElement(llFLAPs())
        EndIf
    ForEver
EndIf
Bild
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Ich kann den Code nicht starten.

Du hast eine Include-Datei nicht angegeben: modFnkDec.pb
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Lösch sie weg, da waren bzw. sind nur Declare Anweisungen drine.
Bild
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Ich glaub da ist so was änliches wie 'Invalid memory access'. Der Fehler wird nur nicht erkannt. Wenn du nämlich ein Programm mit dem Fehler 'Invalid memory access' ohne Debugger startest und keine Fehler-Rotime eingebaut hast hängt das Programm auch.

Ich würde den Code im Englischen Forum Posten. Dort wird sich Fred (wenn er den Thead besucht) bestimmt darum kümmern.
Gesperrt