Rubrik: Verschiedenes / Sonstiges | VB-Versionen: VB2008, VB2010 | 30.10.12 |
Methode zum Debuggen während der Runtime Es wird eine einfach anwendbare Methode zum Debuggen während der Runtime, insbesondere auf Fremdrechnern) gezeigt. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 8.270 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Manchmal hat man das Problem, dass man beim Testen seiner Anwendung auf einem Fremdrechner (also evtl. beim Kunden) nicht einfach an Debug-Informationen kommt. Um das zu ermöglichen/vereinfachen habe ich folgende Vorgehensweise entwickelt.
Ich habe meiner Anwendung eine Form zugefügt "myDebug.frm". Auf ihr befinden sich
- eine Listbox (Dock = Fill)
- ein Toolstrip (Dock = Bottom) mit zwei Buttons
- erster Button "alle löschen" für's Löschen aller ListboxItems
- zweiter Button "kopieren in die Zwischenablage" zum Kopieren aller oder der selektierten Items ins Clipboard
Dazu hier der Code für die Form und Controls:
Public Class myDebug Private Sub myDebug_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.Text = "Debuggen von: " + My.Application.Info.AssemblyName ListBox1.BackColor = setColorBrightness(ToolStrip1.BackColor, 24) ListBox1.Items.Clear() End Sub Private Sub ListBox1_MouseDown(sender As Object, e As MouseEventArgs) _ Handles ListBox1.MouseDown If MOUSEEVENTF_RIGHTDOWN Then ListBox1.SelectedIndex = -1 End Sub Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) _ Handles ToolStripButton1.Click ListBox1.Items.Clear() End Sub Private Sub ToolStripButton2_Click(sender As Object, e As EventArgs) _ Handles ToolStripButton2.Click Dim t As String, i As Short If ListBox1.Items.Count = 0 Then Exit Sub If ListBox1.SelectedItems.Count > 0 Then For i = 0 To ListBox1.SelectedItems.Count - 1 t += ListBox1.SelectedItems(i) + vbCrLf Next Else For i = 0 To ListBox1.Items.Count - 1 t += ListBox1.Items(i) + vbCrLf Next End If My.Computer.Clipboard.SetText(t) End Sub End Class
Für das Eintragen von Debug-Informationen in die Listbox gibt es die Funktion "debugForm" (in einem Modul unterbringen):
''' <summary> ''' Funktion zum Eintragen von Debug-Informationen ''' </summary> ''' <param name="theVar">ein Variablenwert als String</param> ''' <param name="addNo">soll DebugInfo in neue Zeile oder an vorhergehende angehängt werden</param> Public Sub debugForm(theVar As String, Optional addNo As Boolean = False) If addNo Then myDebug.ListBox1.Items(dhDebug.ListBox1.Items.Count - 1) += If(IsNothing(theVar), "~~~", theVar) Else myDebug.ListBox1.Items.Add(If(IsNothing(theVar), "~~~", theVar)) End If End Sub
und als Zusatzfunktion "WhoCalledMe", die dazu dient, die Prozedur zu ermitteln, in der der Aufruf von "debugForm" erfolgt:
''' <summary> ''' Funktion zum Ermitteln des namens der aufrufenden Prozedur ''' </summary> Public Function WhoCalledMe() As String Dim st As StackTrace = New StackTrace() Dim sf As StackFrame = st.GetFrame(1) Dim mb As MethodBase = sf.GetMethod() ' Console.WriteLine("I was called by: " & mb.Name) ' Displays "GetMyName" Return mb.Name End Function
Achtung- für diese Funktion ist im Modul notwendig zu vereinbaren:
Imports System.Reflection, System.Diagnostics
Nun zur praktischen Anwendung.
An der Stelle im Programm, wo man die DebugInfos braucht, schreibt man bspw.
debugForm("Methode: " + WhoCalledMe())
womit man in der Listbox eine Zeile erhält, die den Prozedurnamen derjenigen Prozedur erhält, in der eben diese Zeile steht
debugForm("meinZähler: " + meinZähler.ToString)
um den Wert der Variablen in eine ListboxZeile ein zu tragen
debugForm(vbTab + "PC: " + myPCname, True)
um den PC-Namen, den man vorher ermittelte, an die zuletzt geschriebene Zeile in der Listbox anzufügen.
oder auch etwa
debugForm("* Userdaten") debugForm(theUserID + vbTab + theUserRights + vbTab + thePassword)
wobei hier die Variablen schon Strings sind.
Tipp im Tipp:
Man kann auch eine Stoppuhr laufen lassen und an geeigneten Stellen die Werte in die Listbox eintragen...
Man erhält bei dieser Vorgehensweise in der Listbox eine chronologische Abfolge des Programmablaufs.
In der Anwendung selbst muss man nur dafür sorgen, dass an geeigneter Stelle die Form "myDebug" mittels myDebug.Show() aufgerufen wird.
Ich mache es bspw. so, dass ich in meiner Anwendung einen Startparameter auswerte, der die folgende Form hat: /debugForm=myDebug
Wenn dieser Parameter gesetzt ist, wird die Debugform gezeigt oder nicht.