Debuggen
description
Transcript of Debuggen
Debuggen
Hoofdstuk 9
Hoofdstuk 9 Visual Basic.NET voor studenten 2
In dit hoofdstuk …
Verschillende typen programmeerfouten Gebruik van de debugger Breakpoints en single stepping Veelvoorkomende fouten Optioneel (appendix): het .NET
uitvoeringsmodel
Hoofdstuk 9 Visual Basic.NET voor studenten 3
Inleiding
Bug = fout in een programma Hoe opsporen?
Primitieve hulpmiddeltjes MessageBox.Show(…)
Debugger Stap voor stap door het programma lopen en de inhoud van variabelen bekijken
Lezen van broncode (“Code reading”) Programmeurs checken mekaars code en trachten zo fouten eruit te halen
Inspecteren van Log bestanden: dit zijn tekstbestanden die een programma genereert tijdens de
uitvoering. Core dump: als een programma crasht, dan genereert het een bestand met daarin de
volledige toestand van de processor, geheugen, etc. Oplossen van bugs is voor omvangrijke programma’s geen eenvoudige taak
en is een discipline op zich
Hoofdstuk 9 Visual Basic.NET voor studenten 4
Debuggen: enkele bemerkingen
Fouten opsporen is soms erg moeilijk Bv. een programma met 10 Timers gedraagt zich
iedere keer weer anders. Of een crash zich voordoet hangt soms af van
omgevingsfactoren, bv. wel of geen netwerkverbinding
Een debugger is niet altijd bruikbaar: bv. een programma met 10 Timer objecten kan je niet stilzetten om stap voor stap te doorlopen. Meer nog, soms zijn bugs “verdwenen” precies omdat je de code stap voor stap uitvoert!
Hoofdstuk 9 Visual Basic.NET voor studenten 5
Debuggen: enkele bemerkingen
Fouten oplossen is soms nog moeilijker Je weet in welk stuk code de fout zich voordoet, je wil
deze code veranderen Introduceer je geen nieuwe bugs in deze code? Introduceer je geen nieuwe bugs in andere stukken
code precies omdat je deze code hebt veranderd? Soms is het beter gewoon met een work-around te
werken. Je verandert de code niet, maar voorziet toch een oplossing door bijvoorbeeld een andere manier te geven om hetzelfde te bereiken
Hoofdstuk 9 Visual Basic.NET voor studenten 6
Debuggen: enkele bemerkingen
Je hebt de fout opgelost: hoe bereik je nu je klanten?Patches op het internetService packs…
Probleem: voor welke versies werken deze patches en voor welke versies levert dit juist nieuwe problemen?
Hoofdstuk 9 Visual Basic.NET voor studenten 7
Waar kunnen bugs ontstaan?
Compilatie (at compile time) Syntaxfouten Altijd:
Option Strict On Option Explicit On
Dit zijn de “eenvoudigste” fouten omdat een compiler je de foutenboodschap geeft
Met een goede IDE (zoals Visual Studio) krijg je zelfs tijdens het typen onmiddellijk feedback
Hoofdstuk 9 Visual Basic.NET voor studenten 8
Waar kunnen bugs ontstaan?
Koppelen (at link time)Dit is een mechanisme om andere (binaire)
code met het eigenlijke programma te verbinden
Bijvoorbeeld: MessageBox.Show(…) Waar is de code voor MessageBox? Op welke manier wordt dit “at runtime” gevonden? .NET Managed Execution Environment
(appendix)
Hoofdstuk 9 Visual Basic.NET voor studenten 9
Waar kunnen bugs ontstaan?
Uitvoering (at runtime) Dit zijn de feitelijke “bugs” die vaak moeilijk te vinden en/of op te
lossen zijn Soms krijg je foutboodschappen (Exceptions) Soms krijg je onverwacht/verkeerd gedrag
Deterministisch: je kan precies aangeven wanneer en in welke omstandigheden de fout zich voordoet
Indeterministisch: de fout doet zich soms voor en dan weer niet, je kan geen precieze omschrijving geven wanneer en hoe de fout optreedt
Voorbeeld: een “memory leak”: als een programma voortdurend geheugen verbruikt en niets vrijgeeft gaat het na een tijd crashen, maar het precieze tijdstip is afhankelijk van het gebruik en de reeds aanwezige vrije ruimte
Hoofdstuk 9 Visual Basic.NET voor studenten 10
Demo: de debugger gebruiken
Breakpoints Watch window Single Stepping Case Study Doe dit zelf aan de hand
van de tekst in het handboek
Hoofdstuk 9 Visual Basic.NET voor studenten 11
Appendix: .NET Uitvoeringsmodel
Het hele “.NET Framework” bestaat uit verschillende componenten
Win32Win32
MessageMessageQueuingQueuing
COM+COM+(Transactions, Partitions, (Transactions, Partitions,
Object Pooling)Object Pooling)IISIIS WMIWMI
Common Language RuntimeCommon Language Runtime
.NET Framework Class Library.NET Framework Class Library
ADO.NET: Data and XMLADO.NET: Data and XML
Web ServicesWeb Services User InterfaceUser Interface
VB C++ C#
ASP.NETASP.NET
Perl Python …
Hoofdstuk 9 Visual Basic.NET voor studenten 12
Common Language Runtime
.NET programma’s worden gecompileerd naar bytecode (MSIL) MSIL = MicroSoft Intermediate Language
Deze bytecode wordt door de Common Language Runtime uitgevoerd.NET programma’s zijn dus geen volledige native applicaties
(zoals bijvoorbeeld vroegere C++ programma’s) Dit model biedt echter verschillende voordelen, waaronder
betere beveiliging, platformonafhankelijkheid, betere integratie van verschillende programmeertalen, enz.
Hoofdstuk 9 Visual Basic.NET voor studenten 13
CLR componenten.NET Framework Class Library Support.NET Framework Class Library Support
Thread SupportThread Support COM MarshalerCOM Marshaler
Type CheckerType Checker Exception ManagerException Manager
MSIL to NativeMSIL to NativeCompilersCompilers
CodeCodeManagerManager
GarbageGarbageCollectionCollection
Security EngineSecurity Engine DebuggerDebugger
Class LoaderClass Loader
Hoofdstuk 9 Visual Basic.NET voor studenten 14
Namespaces
Groeperen de bibliotheekklassen van de .NET Framework Class library
Je kan zelf ook Namespaces maken om de klassen van je eigen programma’s logisch te groeperen
Voorbeelden: System (altijd aanwezig, basisklassen) System.Console (schrijven naar DOS vensters) System.Windows.Forms (Formulieren en Controls) System.Drawing (tekenen)
Hoofdstuk 9 Visual Basic.NET voor studenten 15
Namespaces
System System
GlobalizationGlobalization
DiagnosticsDiagnostics
ConfigurationConfiguration
CollectionsCollections
ResourcesResources
ReflectionReflection
NetNet
IOIO
ThreadingThreading
TextText
SecuritySecurity RuntimeRuntime
ServiceProcessServiceProcess
.Serialization .Serialization
.Remoting .Remoting
.InteropServices .InteropServices
Hoofdstuk 9 Visual Basic.NET voor studenten 16
Assemblies
Binaire code (MSIL code) wordt logisch gebundeldDikwijls per namespace, alhoewel niet
verplichtElke assembly heeft een bepaalde versieFysisch: .dll bestandLocatie: GAC (Global Assembly Cache)
Hoofdstuk 9 Visual Basic.NET voor studenten 17
Assemblies
Hoofdstuk 9 Visual Basic.NET voor studenten 18
Compileren via de prompt
Alles wat via Visual Studio mogelijk is, kan ook gebeuren via de command prompt
Dit is nuttig wanneer je zeer grote programma’s moet compileren, waarvan de compilatietijd soms uren kan duren. Dit kan dan automatisch gebeuren (bv. ‘s nachts)
Het helpt bij het begrijpen wat de verschillende stappen zijn bij het maken van een uitvoerbaar programma
Hoofdstuk 9 Visual Basic.NET voor studenten 19
Een simpel programma
Open Notepad en tik bovenstaande in Bewaar als “HelloApp.vb” Open (Onder VS.NET tools) de “VS.NET Command
Prompt”, dus geen gewoon DOS venster!
Option Explicit OnOption Strict On
Public Class HelloApp Public Shared Sub Main() Console.WriteLine("Hallo, een VB.NET programma") End SubEnd Class
Option Explicit OnOption Strict On
Public Class HelloApp Public Shared Sub Main() Console.WriteLine("Hallo, een VB.NET programma") End SubEnd Class
Hoofdstuk 9 Visual Basic.NET voor studenten 20
Compilatie: vbc
vbc /noconfig /target:exe HelloApp.vbvbc /noconfig /target:exe HelloApp.vb
Hoofdstuk 9 Visual Basic.NET voor studenten 21
Compilatieprobleem 1
VS gaat op project niveau standaard een aantal Namespaces importeren (bv. System)
Hier moet dit manueel ingegeven worden in het bronbestand
Option Explicit OnOption Strict On
Imports System ‘ Manuele import, Console wordt nu gevonden
Public Class HelloApp2 Public Shared Sub Main() Console.WriteLine("Hallo, een VB.NET programma") End SubEnd Class
Option Explicit OnOption Strict On
Imports System ‘ Manuele import, Console wordt nu gevonden
Public Class HelloApp2 Public Shared Sub Main() Console.WriteLine("Hallo, een VB.NET programma") End SubEnd Class
Imports System
Hoofdstuk 9 Visual Basic.NET voor studenten 22
Uitvoering
Hoofdstuk 9 Visual Basic.NET voor studenten 23
Een Forms programma
Welke Namespaces voegt VS toe voor elke Windows Applicatie? In welke Namespace bevindt zich de MessageBox klasse?
Option Explicit OnOption Strict On
Public Class HelloApp2 Public Shared Sub Main() MessageBox.Show("Hallo, een VB.NET programma") End SubEnd Class
Option Explicit OnOption Strict On
Public Class HelloApp2 Public Shared Sub Main() MessageBox.Show("Hallo, een VB.NET programma") End SubEnd Class
Hoofdstuk 9 Visual Basic.NET voor studenten 24
Een Forms programma
Option Explicit OnOption Strict On
Imports System.Windows.Forms
Public Class HelloApp2 Public Shared Sub Main() MessageBox.Show("Hallo, een VB.NET programma") End SubEnd Class
Option Explicit OnOption Strict On
Imports System.Windows.Forms
Public Class HelloApp2 Public Shared Sub Main() MessageBox.Show("Hallo, een VB.NET programma") End SubEnd Class
Imports SystemImports System.Windows.Forms
Hoofdstuk 9 Visual Basic.NET voor studenten 25
Compileren
De broncode is juist, maar de binaire code voor MessageBox wordt niet gevonden
Je moet meegeven met welke assembly deze applicatie gekoppeld moet worden (cfr bugs tijdens het koppelen)
Hoofdstuk 9 Visual Basic.NET voor studenten 26
Compilatieprobleem 2
vbc /noconfig /target:exe /reference:System.Windows.Forms.dllHelloApp3.vb
Of
vbc /noconfig /target:winexe /reference:System.Windows.Forms.dllHelloApp3.vb
vbc /noconfig /target:exe /reference:System.Windows.Forms.dllHelloApp3.vb
Of
vbc /noconfig /target:winexe /reference:System.Windows.Forms.dllHelloApp3.vb
/reference koppelen aan een assembly /target:exe maak een programma dat vanuit een console venster opgeroepen wordt /target:winexe maak een programma dat dmv dubbelklik in Explorer kan
opgeroepen worden
Hoofdstuk 9 Visual Basic.NET voor studenten 27
De optie /noconfig
In alle vorige commando’s meegegeven Betekenis: geen standaard bibliotheekklassen
importeren Als je deze optie dus weglaat, hoef je geen /reference te doen, omdat dit automatisch zal gebeuren
Omwille van didactische redenen hebben we /noconfig toegevoegd, maar door het weg te laten worden de commando’s veel korter!