VB6 hat keinen Profiler? Dann bau ich mir eben einen

Tags: VB6 · VB.NET · Performance-Profiling · Developer Tools · Legacy-Modernisierung

Der VB6 Profiler ist ein eigenes Entwicklungsprojekt von HPApps. Er ist für eigene oder rechtmäßig genutzte VB6-Projekte gedacht — nicht zum Analysieren fremder Software ohne Berechtigung.

VB6 Profiler Performance messen war jahrelang Handarbeit mit Debug.Print Timer. Der VB6 Profiler Performance-Ansatz in diesem Projekt instrumentiert Methoden automatisch und liefert Aufrufzeiten, Hotspots und Vergleiche – ohne das Original-Projekt anzufassen.

VB6 Profiler – Hauptoberfläche mit Projektbaum und Aufrufliste

VB6 Profiler Performance: Das Problem

Zunächst das Kernproblem: Visual Basic 6 ist über 25 Jahre alt — und hat bis heute keinen eingebauten Profiler. Wer wissen will, welche Methode am längsten braucht, landet schnell bei der Steinzeit-Lösung: Debug.Print Timer vor und nach dem verdächtigen Codeblock.

Für ein einzelnes Problem geht das noch. Für eine Anwendung mit hunderten Methoden über mehrere Module hinweg ist es jedoch keine Option.

Im Gegensatz dazu bringen moderne Sprachen Profiler oft direkt in der IDE mit. VB6 bringt nichts mit — die IDE wird seit Jahren nicht mehr weiterentwickelt. Also musste ein eigenes, externes Werkzeug her.

Es soll sich in ein gewachsenes VB6-Projekt einklinken, ohne es zu gefährden.

VB6 Profiler Performance: Die Idee

Der VB6 Profiler ist deshalb eine eigenständige VB.NET-Anwendung. Sie liest ein VB6-Projekt (oder eine Projektgruppe) ein und versteht Methoden sowie Zeilen.

Anschließend legt sie bei Bedarf eine temporäre Kopie an und fügt dort automatisch Zeitmess-Code ein. Das Original wird nie verändert — alle Eingriffe passieren in einer Wegwerf-Kopie im Temp-Verzeichnis.

Im Konfigurator wählst du außerdem, was überwacht werden soll: Projekt, Datei, Methode oder einzelne Zeilen. Der Profiler kümmert sich um Kopie, Instrumentierung und Start.

VB6 Profiler Performance: Funktionen

Ganze Projekte und Projektgruppen einlesen

.vbp– und .vbg-Dateien werden vollständig geparst. Module, Formulare, Klassen, Methoden und einzelne Quellcodezeilen erscheinen als durchsuchbarer Baum.

Ein Suchfeld filtert live nach Projekt, Datei, Methode oder Quellcode-Inhalt. Optional zeigst du nur bereits überwachte Elemente an.

VB6 Profiler – Projektbaum mit Suchfeld

Feingranulare Überwachungskonfiguration

Die Überwachung lässt sich exakt dosieren: komplettes Projekt, einzelne Datei, einzelne Methode — oder zeilenbasiert bis auf einzelne Codezeilen.

Jeder Knoten im Baum hat eine eigene Checkbox. Die Konfiguration wird pro Projekt gespeichert, sodass du beim nächsten Start nicht bei null anfängst.

Automatische Instrumentierung im Detail

Beim Start passiert Folgendes automatisch: Das Projekt wird in einen Temp-Ordner kopiert. Anschließend kommen Modul_Profiler.bas und Klasse_Profiler.cls in jedes betroffene Projekt.

In jeder überwachten Methode werden Start- und Ende-Aufrufe eingebaut. Bei zeilenbasierter Überwachung sogar vor und nach jeder markierten Zeile. VB6 kompiliert und startet die Kopie ganz normal — nur mit Mitschreiben.

Präzise Zeitmessung mit Windows-Bordmitteln

Zudem kommt statt ungenauer Sekunden-Ticks QueryPerformanceCounter zum Einsatz — dieselbe High-Resolution-API wie bei professionellen Windows-Profilern.

Gemessen wird die Zeit seit dem letzten Log-Eintrag — auf Methoden- und Zeilenebene, in Millisekunden mit Nachkommastellen. Die Profiler-I/O wird herausgerechnet, damit sie die Werte nicht verfälscht.

Live mitschauen, während das Programm läuft

Sobald der Profiler läuft,, erscheinen Methodenaufrufe in Echtzeit — mit Dauer, Aufrufzahl und Status „läuft noch“ oder „abgeschlossen“.

Ein Klick schaltet zwischen detaillierter Ansicht (jeder Zeilenaufruf) und gruppierter Ansicht (Summe und Häufigkeit pro Zeile) um.

Eingebetteter Quellcode-Viewer

Wählst du einen Aufruf aus, zeigt der Quellcode-Viewer sofort die passende Stelle. Er lässt sich einbetten, in ein Extra-Fenster legen oder ausblenden.

So gleichst du auffällige Laufzeiten direkt mit dem Code ab — ohne zwischen VB6-IDE und Profiler zu wechseln.

Ressourcen im Blick, nicht nur Zeit

Zusätzlich zur Laufzeit zählt der Profiler den GDI-Handle-Verbrauch pro Methodenende. GDI-Lecks werden so direkt sichtbar — statt erst nach Stunden im Dauerbetrieb.

Mehr dazu im MenuEx-Kontextmenü-Projekt, das genau solche Lecks vermeidet.

Fehler nicht verpassen

Unbehandelte Exceptions landen in einer eigenen Fehlerliste — mit Meldung und Stacktrace. Praktisch, wenn ein Absturz genau während einer Profiling-Sitzung passiert.

Persistenz & schneller Workflow

Die Überwachungs-Konfiguration wird pro Projekt in JSON gespeichert. Beim nächsten Start ist alles wieder wie zuletzt eingestellt.

Dazu kommt ein auf Tastatur-Bedienung ausgelegter Workflow:

TasteAktion
Strg+FFokus ins Suchfeld (Projekt/Datei)
Strg+OVB6-Projekt/Konfiguration auswählen
F3Projekt im Konfigurator in VB6 öffnen
F4Profiler starten/neu starten
F5Instrumentierte Projektkopie in VB6 öffnen
EscProfiler stoppen
EntfMethode von der Überwachung ausschließen

Unter der Haube

Performantes Logging

Logs werden im Speicher gepuffert (bis zu 10.000 Einträge) und blockweise geschrieben. So wird die Datei nicht bei jedem Messpunkt angefasst.

GDI-Handle-Messungen laufen nur am Methodenende — nicht bei jeder Zeile. OpenProcess-Aufrufe sind gegen Fehlschläge abgesichert.

Mehrstufiges Thread-Modell

Ein Thread liest Logs vom Dateisystem. Ein zweiter ordnet sie Methoden und Zeilen zu. Ein dritter erkennt abgeschlossene Aufrufe und meldet sie ans UI.

Die Anzeige bleibt deshalb auch bei vielen Aufrufen pro Sekunde flüssig.

Datenmodell und UI

Für die Oberfläche kommen ObjectListView und FastColoredTextBox zum Einsatz. Ein VB6-Datenmodell (Projekt → Datei → Methode → Zeile) bildet die Struktur inklusive Windows-1252 sauber ab.

Die Konfiguration liegt lokal in SQLite (System.Data.SQLite).

Fazit

Schließlich: Was mit „Welche Methode braucht so lange?“ begann, ist heute ein vollwertiges Profiling-Werkzeug für VB6 — mit Live-Auswertung, zeilengenauer Messung und sicherer Instrumentierung.

Legacy-Technologie muss man nicht ersetzen, um sie endlich verstehbar zu machen.

Weitere VB6-Projekte im Blog: MSChart mit WebView2, VB6 Profiler, MenuEx-Kontextmenü und VB6 Time Picker.