Debugging en Tracing met Visual Basic.NET André Obelink, MCSD Visual Basic Groep
Me.About Me.VBG - een van de oprichters 1995, eindredacteur, website Me.Experience - VIC20, Commodore 64, Clipper CBM basic vanaf 1982 - Visual Basic 1.0 Visual Basic.NET 2003/2005 - Rich Clients, Componenten, N-Tier, API s, Databases Me.Write() - Visual Basic Magazine, Microsoft.NET Magazine Me.CurrentJob -...
Visual Studio.NET debugger Alle.NET talen - Visual Basic.NET, C#, Native Win32 talen - Visual Basic 5.0, Visual Basic 6.0, C++, Transact-SQL - SQL Server 7.0, SQL Server 2000, Alle ASP.NET talen Alle ASP talen - VBScript, Jscript,
Verschillende typen fouten Syntax Errors - compiler kan code niet compileren - relatief makkelijk op te lossen, de VS.NET IDE biedt je hulp - voorbeeld: typefouten, parameters vergeten etc. Runtime Errors - code is gecompileerd - met debugging goed te traceren - te voorkomen door defensief te programmeren en exceptionhandling - bijvoorbeeld: delen door 0, netwerkverbinding niet aanwezig etc. Logical Errors - alles lijkt goed te gaan. - meest lastige fouten om op te sporen en op te lossen - bijvoorbeeld: berekeningen kloppen niet, onjuiste data in database
Edit & Continue in VB.NET 2003 Geen Edit & Continue meer aanwezig - heeft te maken met het feit dat we werken met gecompileerde code - goede nieuws: vanaf Visual Studio 2005 is het weer beschikbaar Waarom Edit & Continue niet moet terugkeren - Informality het spanningsveld tussen debuggen en testen - Trial and Error oplossen zonder werkelijk begrip van de fout - Er worden makkelijker nieuwe bugs geïntroduceerd. - inherent aan ad-hoc aanpassingen - tijdens een sessie meerdere fouten oplossen verhoogt risico nieuwe bugs - aanpassingen aan kleine codeblokken verhoogt risico nieuwe bugs
Configuration Manager Configuration = Debug Symbolbestand (*.pdb) Buildconfiguraties bestaan op 2 niveaus Project Solution
Breakpoints Veel gebruikte manier om debuggen te initiëren Flexibeler met condities, hitcount etc. Breakpoints worden opgeslagen bij project Breakpoint-window breakpoint tijdelijk uitzetten
Demo Breakpoints
Debug windows Output-window Locals-, Autos- en Watch-window - alleen de scope is anders - je kunt vanuit deze windows waarden muteren Command- en Immediate-window - hetzelfde window, het kan echter in Immediate-mode draaien - Command-window zoals naam zegt: commando s uitvoeren - Immediate-window opvragen variabelen, aanroepen procedure Andere windows - Call Stack-window - Me-window - Threads-window - Module-window - Register-window - Memory-window
Demo Debug Windows
Debug en Trace classes Classes met dezelfde met properties en methods - Trace ook geschikt voor gecompileerde applicaties in het veld Het zijn Shared classes soort public object Debug methods alleen aangeroepen wanneer DEBUG is aangegeven Trace methods alleen aangeroepen wanneer TRACE is aangegeven Zowel voor VB.NET als C# geldt: Release-builds standaard TRACE = True
Tracing code Write() en WriteLine() informatie wegschrijven - de informatie wordt naar elke TraceListener gestuurd WriteIf() en WriteLineIf() hiermee heb je invloed op het wel/niet loggen van de informatie - je eigen condities, zoals : x>y, intklantnr = 100 etc. - BooleanSwitch, TraceSwitch Fail() en Assert() Assert indien conditie: False Bovenstaande methods accepteren een geformateerde string: (message, category) - helaas zijn dit sealed classes, daardoor niet snel te verhelpen
Trace opmaak informatie Trace en Debug classes kennen properties en methods waarmee je de formattering kan beïnvloeden IndentSize - het aantal spaties dat ingesprongen moet worden IndentLevel - past de inspringing aan voor de huidige WriteLine() of WriteLineIf() Indent() en Unindent() methods wijzigen ook de IndentLevel
Trace class Write() en WriteLine() kent twee parameters 1. Message de tekst die je wilt loggen 2. Category de categorie van de melding De informatie wordt als volgt geformateerd: - <category> : <message> Trace.WriteLine( Eerste niveau, info ) Trace.Indent() Trace.WriteLine( Tweede niveau ) Trace.Unindent() Trace.WriteLine( Eerste niveau, info ) info: Eerste niveau Tweede niveau info: Eerste niveau
Trace Listeners Alle gelogde data wordt doorgeven aan alle trace listeners binnen het Application Domain - meestal geconfigureerd door het Config-bestand - je kunt ook at runtime classes toevoegen aan de collectie Elke Application Domain creëert haar eigen TraceListners collectie Trace Listeners zijn afgeleidt van de TraceListeners class dus zelfbouw mogelijk!
Trace Listeners Class DefaultTraceListener (standaard aanwezig) EventLogTraceListener Omschrijving Trace berichten worden weggeschreven naar naar OutputDebugString en naar de geattachde debugger (VS.IDE). Trace berichten worden weggeschreven naar het aangegeven EventLog. TextWriterTraceListener MijnTraceListener Trace berichten worden weggeschreven naar het aangegeven Tekstbestand (Stream) Trace berichten worden weggeschreven naar een SQL-Server of Accessbestand of
Demo Debug en Trace classes
BooleanSwitch en TraceSwitch Invloed op welke data er gelogd wordt BooleanSwitch True/False Aan/Uit TraceSwitch 5 niveaus cumulatief - Off (0) Geen Trace - Error (1) Summiere foutmeldingen - Warning (2) Error + waarschuwingen - Info (3) Warning + andere korte boodschappen - Verbose (4) Info + gedetailleerde boodschappen Ook in te stellen in Application Config bestand Jij moet zelf waarden checken! WriteLineIf()
Switches in Application Config <?xml version="1.0" encoding="utf-8"?> <configuration> <system.diagnostics> <switches> <add name="mijnbooleanswitch" value="1" /> <add name="mijntraceswitch" value="3" /> </switches> </system.diagnostics> </configuration>
Voorbeelden gebruik Switches Dim objblnswitch As New BooleanSwitch("MijnBooleanSwitch", "") Dim objtrcswitch As New TraceSwitch("MijnTraceSwitch","") ' Value = 1 --> Wel loggen Trace.WriteLineIf(objBlnSwitch.Enabled = True, "Boolean") ' Value = 3, Error = 1, 1 < 3 -- > Wel loggen Trace.WriteLineIf(objTrcSwitch.TraceError = True, "Error") ' Value = 3, Verbose = 1, 4 niet < 3 -- > Niet loggen Trace.WriteLineIf(objTrcSwitch.TraceVerbose = True, "Verbose")
Dynamische TraceListener <?xml version="1.0" encoding="utf-8"?> <configuration> <system.diagnostics> <switches> <add name="mijnbooleanswitch" value="1" /> <add name="mijntraceswitch" value="3" /> </switches> <trace autoflush="true"> <listeners> <add name="mijnlog" type="system.diagnostics.textwritertracelistener" initializedata="c:\mijnlog.log" /> </listeners> </trace> </system.diagnostics> </configuration>
Demo Dynamische TraceListener
Debug SQL-Server Stored Procs Min. SQL Server 7.0, SQL Server 2000 aanbevolen Database server min. Windows NT 4.0 MSDE2000 kan men debuggen met VS.NET Pro > Voor echte SQL2000 VS.NET Ent. of Architect Installeer SDI (niet standaard).
Probleemoplossing debug SQL Sqlle.dll + Sqldbreg2.exe op debug werkstation Sqldbg.dll op server + debug werkstation + registr. Mssdi98.dll in \binn map van SQL Server - SQLServer2000 installatie VS.NET juiste versie op juiste locatie - MSDE2000 installatie VS.NET Pro juiste versie op onjuiste locatie Rechten op sp_sdidebug stored procedure - hangt af van gebruikte accounts (service + programma) - EXEC master..sp_sdidebug WinXP SP2 niet debuggen in eigen applicatie - debuggen vanuit Server Explorer Step Into gaat goed - op aanvraag hotfix bij Microsoft beschikbaar
Debuggen SQL-Server Server Explorer Stored Proc Step Into SP Breakpoint moet wel in Stored Procedure zelf staan en kan niet in aanroepende functie Binnen code-windows ook Run Selection
Demo SQL Server debugging
Samenvattend Tracing is een geweldige tool, omdat - je inzicht kunt krijgen in lastige, logische problemen - je flexibel bent in het wel/niet tracen, welk niveau, welke opslagmedia - je van buitenaf het trace-gedrag kan beïnvloeden (App.Config) Tracing is een geweldige tool, maar - klant moet niet de indruk krijgen dat je programma vol bugs zit - proberen te vermijden om veel te tracen naar EventLog (traag) - elke WriteLineIf() is een check in je programma (performance) - Trace.Assert staat is enabled in standaard Release Builds - *.pdb bestanden nodig, maar beïnvloeden performance nadelig
Meer informatie Comprehensive VB.NET debugging Mark Pierce - A!Press Microsoft.NET Magazine #7 Debugging en Tracing met Visual Basic.NET André Obelink, VBG (december 2004) http://msdn.microsoft.com http://www.informit.com
een samenwerking tussen 2004 André Obelink andre@obelink.com
Conditional Compilation #Const Debug = False #Const Trace = True ' Debugging uit ' Tracing aan Class VerkoopOrder Public Sub Save() #If Debug Then ControleerRegelsMetKop() #If Trace Then SchrijfNaarLog( Test 1,2,3 ) #End If #End If VerkoopOrderOpslaan() End Sub End Class In dit geval nooit bij Trace
Trace Listeners - Constructor De InitializeData attribuut wordt aangegeven in de constructor van de TraceListener New() - DefaultTraceListener, geen parameters - EventLogTraceListener, de naam van het EventLog - TextWriterTraceListener, de naam van het tekstbestand of de stream