Merkwürdiger aber reproduzierbarer Fehler im Debugger
Verfasst: 11.08.2006 18:19
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.
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