erweiterte Fehlerangabe außerhalb der BMax IDE

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

klepto2

Betreff: erweiterte Fehlerangabe außerhalb der BMax IDE

BeitragSa, Sep 23, 2006 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
So, erst kam mein Tutorial und jetzt kommt ein kleiner Code mit dem man erweiterte Fehlerinfos aus seinem Programm auslesen kann.
Also nicht so wie es sonst bei Bmax ist, das man nur eine einzeilige Fehlernachricht sieht, sondern halt noch infos wie Zeile, Reihe und Source Datei des Fehlers.

Insgesammt ist es noch erweiterbar, indem zb: den gesammten Debugtree abfragen könnte, einen Send to Support button einbaut etc..

Der Code baut auf dem Prinzip von 2 exe Dateien auf, wobei die eine in der Debugger exe eingebaut ist und beim Start auf die HD kopiert wird und nach dem das Programm beendet wurde, wird die Datei wieder gelöscht.

Einzige Vorraussetzung für die integrierte Datei: sie muss im DebugModus kompiliert sein. (ist zwar größer, sollte aber bei Projekten größerer Art nicht das Problem sein.

Der externe Debugger (sozusagen)
Code: [AUSKLAPPEN]

Framework BRL.RamStream
Import BRL.WAVLoader
Import BRL.PNGLoader
Import BRL.FileSystem
Import PUB.FreeProcess
Import BRL.FreeAudioAudio
Import BRL.Win32MaxGUI

Incbin "Windows XP-Fehler.wav"
'Hier die Datei incbinnen, die ausgeführtwerden soll
Incbin "testback.exe"

Global Filename:String = "testback.exe"


Type TExDebug
   Field FilePath:String
   Field Process:TProcess
      
   Function Init:TExDebug(Url:String)
      Local D:TExDebug = New TExDebug
      If FileType(Url) = 0 Then SaveIncbintoDisk()
      D.FilePath = Url
      AppTitle = StripDir(Url)
      Return D
   End Function
   
   Method Start()
      Process = CreateProcess(FilePath)
      DeleteFile(FilePath)
      While Process.Status()
         Local Info:String = Process.err.ReadLine()
         If Info <> "" Then         
            'Processing ErrorMessage"
            Info = Info[2..]
            Local Uhe:Int = Len("Unhandled Exception")
            If Info[..Uhe] = "Unhandled Exception" Then
               '
               Process.pipe.WriteLine("T")
               Local Data:String = CollectErrorData()
               
               'Notify Info[Uhe + 1..] + "~n~n"+ "Info:~n"+ Data
               Local I:TErrorInfo = TErrorInfo.Create(AppTitle ,Info[Uhe + 1..] , Data)
               I.Show()
               'DebugStop()
               Process.pipe.WriteLine("Q")

               Process.Terminate()
               Delay 200
               DeleteFile(Filename)
            EndIf
            
         EndIf
      Wend
      Print FilePath + FileType(FilePath) + " : " + Process.Status()
      'Local T:Byte = DeleteFile(FilePath)
      'If Not T Then Print "File not deleted"
   End Method
   
   Method CollectErrorData:String()
      Local Data:String = ""
      Repeat
         Local Temp:String =  Process.err.ReadLine()
         'Data:+ Temp[2..] + "~n"
         If Temp[2] = Asc("@") Then
            Local LF:Int = Temp.Find("<")
            Temp = Temp.Replace( "<" , "")
            Temp = Temp.Replace( ">" , "")
            If Data <> "" Then Data:+"~n"
            Data:+ "Error Location in : ~n" + StripDir(Temp[2..LF - 1]) + "~nin Line\Row : ~n" + temp[LF - 1..] + "~n~n" + "Debugdata : ~n~n"
         Else
            Local Temp2:String = Temp.Replace("~~>" , "")
            If Temp2.ToLower().Find("stacktrace") <> 0 Then
               If Temp2 = "}" Then
                  Data:+ "~nDatablock Ended"
               ElseIf Temp2 <> ""
               'Temp2 = Temp2.Replace("}" , "")
               Data:+ Temp2 + "~n"
               EndIf
            EndIf
         EndIf
         
      Until  Temp = ""
      Return Data
   End Method
   
End Type




Local D:TEXDebug = TExDebug.Init(Filename)
   
D.Start()

'DeleteFile Filename

Type TErrorInfo
   Field Window:TGadget
   Field ErrorInfo:TGadget
   Field Title:String
   Field ErrorMessage:String
   Field ErrorData:String
   Field OKButton:TGadget
   
   Function Create:TErrorInfo(Title:String , Message:String , Data:String)
      Info:TErrorInfo = New TErrorInfo
      Info.Title = Title
      Info.ErrorMessage = Message
      Print Message
      Info.ErrorData = Data
      Return Info
   End Function
   
   Method Show()
      Local Sound:TSound = LoadSound("incbin::Windows XP-Fehler.wav")
      PlaySound(Sound)
      Local D:TGadget = Desktop()
      Local W:Int = 300
      Local H:Int = 400
      Window = CreateWindow(Title , D.Width / 2 - (W / 2) , D.Height / 2 - (H / 2) , W , H , , WINDOW_TITLEBAR)
      CreateLabel("Error : " + ErrorMessage , 20 , 20 , W - 20 , 40 , Window)
      CreateLabel("DebugData : " , 20 , 60 , W - 20 , 20 , Window)
      ErrorInfo = CreateTextArea(20 , 80 , W - 50 , H - 180 , Window , TEXTAREA_READONLY)
      SetTextAreaText(ErrorInfo , ErrorData)
      
      OKButton = CreateButton("OK",W/2-30,H-80,60,40,Window)
      
      While Window
         WaitEvent()
         If EventID() = EVENT_GADGETACTION
            'Select EventSource()
            'Case OKButton
               FreeGadget Window
               Exit
            'End Select
         EndIf
         If EventID() = EVENT_WINDOWCLOSE
            FreeGadget Window
            Exit
         EndIf
      Wend
   End Method
   


End Type

Function SaveIncbinToDisk()
   Local Bank:TBank = LoadBank("incbin::"+Filename)
   SaveBank( Bank , Filename)
   Bank = Null
End Function

Function OnEnd()
   TProcess.TerminateAll()
   
   'DeleteFile(Filename)
End Function


und hier der code, der Testback.exe

Code: [AUSKLAPPEN]

Framework BRL.StandardIO

Type TTest
   Field A:Int
   
   Method Multi()
      Print A / 0
   End Method
   
End Type

Global Test:String = "Hello World"

Out(Test)

Local T:TTest = New TTest
T.A = 16
T = Null
T.Multi()


Function Out(Output:String)
   'DebugStop()
   Print Output
End Function
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group