Debuggen

27
Debuggen Hoofdstuk 9

description

Debuggen. Hoofdstuk 9. In dit hoofdstuk …. Verschillende typen programmeerfouten Gebruik van de debugger Breakpoints en single stepping Veelvoorkomende fouten Optioneel (appendix): het .NET uitvoeringsmodel. Inleiding. Bug = fout in een programma Hoe opsporen? Primitieve hulpmiddeltjes - PowerPoint PPT Presentation

Transcript of Debuggen

Page 1: Debuggen

Debuggen

Hoofdstuk 9

Page 2: Debuggen

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

Page 3: Debuggen

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

Page 4: Debuggen

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!

Page 5: Debuggen

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

Page 6: Debuggen

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?

Page 7: Debuggen

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

Page 8: Debuggen

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)

Page 9: Debuggen

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

Page 10: Debuggen

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

Page 11: Debuggen

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 …

Page 12: Debuggen

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.

Page 13: Debuggen

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

Page 14: Debuggen

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)

Page 15: Debuggen

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

Page 16: Debuggen

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)

Page 17: Debuggen

Hoofdstuk 9 Visual Basic.NET voor studenten 17

Assemblies

Page 18: Debuggen

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

Page 19: Debuggen

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

Page 20: Debuggen

Hoofdstuk 9 Visual Basic.NET voor studenten 20

Compilatie: vbc

vbc /noconfig /target:exe HelloApp.vbvbc /noconfig /target:exe HelloApp.vb

Page 21: Debuggen

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

Page 22: Debuggen

Hoofdstuk 9 Visual Basic.NET voor studenten 22

Uitvoering

Page 23: Debuggen

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

Page 24: Debuggen

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

Page 25: Debuggen

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)

Page 26: Debuggen

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

Page 27: Debuggen

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!