Sisäänrakennetun debuggerin käyttö



Samankaltaiset tiedostot
BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

Visual C++ -ohjelman tekeminen ja suunnittelu

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

Kehitysympäristö LUKU. Developer Studio kehitysympäristön alkeet. Liikkuminen projektin työtilassa ja sen eri näkymissä

erasmartcardkortinlukijaohjelmiston

PRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER

Ohjelmoinnin perusteet Y Python

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

TTY TKT-1110 Mikroprosessorit TKT. HEW-ohjeet ver 1.0

Jypelin käyttöohjeet» Ruutukentän luominen

Muuttujien määrittely

Valintanauhan komennot Valintanauhan kussakin välilehdessä on ryhmiä ja kussakin ryhmässä on toisiinsa liittyviä komentoja.

Avaa ohjelma ja tarvittaessa Tiedosto -> Uusi kilpailutiedosto

5. HelloWorld-ohjelma 5.1

JAKELUPISTE KÄYTTÖOHJE 2/6

Skype for Business ohjelman asennus- ja käyttöohje Sisällys

11. Javan toistorakenteet 11.1

Ohjelmoinnin peruskurssi Y1

CISS Base Excel raporttien määritys Käyttäjän käsikirja. CISS Base Käyttäjän Käsikirja Econocap Engineering Oy 1

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Projektin luonti LPCXpressolla

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

12. Javan toistorakenteet 12.1

Luento 5. Timo Savola. 28. huhtikuuta 2006

Ohjelmoinnin perusteet Y Python

KUVAN TUOMINEN, MUOKKAAMINEN, KOON MUUTTAMINEN JA TALLENTAMINEN PAINTISSA

Harjoitustyö: virtuaalikone

Tiedostojen lataaminen netistä ja asentaminen

WCONDES OHJEET ITÄRASTEILLE (tehty Condes versiolle 8)

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

(Tätä ohjetta saa käyttää yliopiston opetustarkoituksiin ja jatkokehittelyyn.)

Skype for Business ohjelman asennus- ja käyttöohje Sisällys

ELOKUVAKASVATUS SODANKYLÄSSÄ VIDEON SIIRTÄMINEN DVD-LEVYLLE

HOW-TO: Kuinka saan yhdistettyä kaksi tulospalvelukonetta keskenään verkkoon? [Windows XP]

12. Javan toistorakenteet 12.1

VisualStudio Pikaopas, osa 1: WEB sivujen suunnittelu

Osoitin ja viittaus C++:ssa

BaseMidlet. KÄYTTÖOHJE v. 1.00

Ohjelman Suositukset. Luku 5 Suositukset

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

WCONDES OHJEET ITÄRASTEILLE (tehty Condes versiolle 8)

Coolselector Asennusohje

Ohjelmoinnin peruskurssi Y1

17 BUDJETOINTI. Asiakaskohtainen Budjetti Ylläpito-ohjelma. Dafo Versio 10 BUDJETOINTI. Käyttöohje. BudgCust Yleistä

Zeon PDF Driver Trial

MultiBoot. Käyttöopas

OPISKELIJAN OPINNOT -NÄYTTÖ. Opiskelijan opintosuoritustietoja katsellaan Opiskelijan opinnot -näytöltä. Näyttö löytyy päävalikosta Opinnot.

5. HelloWorld-ohjelma 5.1

1 Funktiot, suurin (max), pienin (min) ja keskiarvo

Hellä ensikosketus. Tomi Kiviniemi

Sähköposti ja uutisryhmät

Olet tehnyt hyvän valinnan hankkiessasi kotimaisen StorageIT varmuuskopiointipalvelun.

Ohjelmoinnin perusteet Y Python

TTS kannattavuuslaskentaohjelma

C# 3.0:n uudet ominaisuudet Language Integrated Query...45

Kompassi-digikokeen julkaisu opettaja

OHJE EXCEL-MAKRON LUOMISEKSI JA MAKRON KÄYTÖSTÄ

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

TIETOKONEEN ASETUKSILLA PARANNAT KÄYTETTÄVYYTTÄ

KEMI-TORNIONLAAKSON KOULUTUSKUNTAYHTYMÄ LAPPIA LANGATON VIERAILIJAVERKKO 2(7) VERKKOYHTEYDEN MÄÄRITTELY WINDOWS XP:LLE (WINDOWS XP SP3)

KESKUSTANUORTEN NETTISIVUT- OHJEITA PIIRIYLLÄPITÄJÄLLE 1. KIRJAUTUMINEN

ITKP102 Ohjelmointi 1 (6 op)

erasmartcard-kortinlukijaohjelmiston asennusohje (mpollux jää toiseksi kortinlukijaohjelmistoksi)

Tobii Communicator 4. Alkutoimet

HP ProBook 430 G5 kannettavien käyttöönotto

Sonera Viestintäpalvelu VIP VIP Laajennettu raportointi Ohje

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Käyttöopas RoofCon Viewer

Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: {

Osoittimet ja taulukot

Condes. Quick Start opas. Suunnistuksen ratamestariohjelmisto. Versio 7. Quick Start - opas Condes 7. olfellows 1.

4. Luokan testaus ja käyttö olion kautta 4.1

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Tekstinkäsittely ja opinnäytetyö I sisällysluettelo ja sivunumerointi. Word 2007

KUVANKÄSITTELY THE GIMP FOR WINDOWS OHJELMASSA

Suvi Junes/Pauliina Munter Tietohallinto/Opetusteknologiapalvelut 2014

Juha Haataja

Send-It ilmoittautumisjärjestelmä (judotapahtumat Suomessa)

Moottorin kierrosnopeus Tämän harjoituksen jälkeen:

811120P Diskreetit rakenteet

Muistitikun liittäminen tietokoneeseen

Pikanäppäin Yhdistelmiä. Luku 6 Pikanäppäimet

Kirjan toteutus BoD easybook -taittotyökalun avulla

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

811120P Diskreetit rakenteet

Tilastolliset ohjelmistot A. Pinja Pikkuhookana

Valitse aineisto otsikoineen maalaamalla se hiirella ja kopioimalla (Esim. ctrl-c). Vaihtoehtoisesti, Lataa CSV-tiedosto

Ohjelmoinnin perusteet Y Python

OHJE Jos Kelaimeen kirjautuminen ei onnistu Mac-koneella Sisällys

Ohjelmoinnin peruskurssi Y1

Asiointipalvelun ohje

12. Näppäimistöltä lukeminen 12.1

Visma Business AddOn Tuotetarrat. Käsikirja

Automaattitilausten hallinta. Automaattitilauksien uudistettu käsittely

Octo käyttöohje 1. Sisältö

Mainosankkuri.fi-palvelun käyttöohjeita

MICROSOFT EXCEL 2010

Ohjelmoinnin perusteet Y Python

Tämä ohje on laadittu Mozilla Firefoxin asetuksille versiossa

Transkriptio:

OSA VII 653 LUKU 27 27 LUKU Sisäänrakennetun debuggerin käyttö Ohjelmien kääntäminen debuggauskäyttöön tai julkaistavaksi optimoituna Virheiden hakeminen koodirivien yksittäisaskellusta käyttäen Ikkunoiden ja niiden sanomien tarkkaileminen

654 Kehittyneet tekniikat Debuggaus- ja selaustietojen luominen Suuri osa ohjelman kehitystyöstä on itse asiassa ohjelmasi debuggaamista. Kaikkien ohjelmistojen kehittäminen jakaantuu selkeästi suunnitteluun, toteutukseen ja debuggaamiseen. Visual C++ -työkalussa on debuggausympäristö merkittävänä osana ja käytettävät debuggaustyökalut auttavat myös ohjelmankehityksessä. Löydät ohjelman ongelmakohdat nopeasti tutkimalla muuttujien arvoja ajon aikana ja seuraamalla ohjelman kulkua niin omassa kuin MFCkoodissakin. Spy++-ohjelman kaltaiset työkalut osaavat näyttää Windowsin ja ohjelmasi välillä lähetetyt sanomat ja mahdollistavat sovellusten käyttämien käyttöliittymäkontrollien ja Windows-tyylien selvittämisen. Projektin aktiivisen konfiguraation asettaminen Projektin aktiivinen konfiguraatio tarkoittaa kääntäjälle tulosohjelman tuottamiseksi annettuja konfigurointiohjeita. Kun sovellus on kehitetty valmiiksi Debugkonfiguraatiolla, saadaan julkaistava versio pienemmäksi ja nopeammaksi Releasekonfiguraatiolla. Aktiivinen konfiguraatio muutetaan Build-valikon Set Active Configuration - komennolla, mikä näyttää aluksi Set Active Configuration - valintaikkunassa luettelon projektin konfiguraatioista. Release-konfiguraatio voidaan valita tästä kaksoisnapauttamalla, jolloin kääntäjä alkaa käyttää sen määrittelyjä Debugkonfiguraation sijaan. Debug- ja Release tilan käyttö Sovellusta käännettäessä on valittavissa kaksi selkeästi eri kääntäjän konfiguraatiota: Debug- ja Release-tila. Voit muuttaa käytettävää konfiguraatiota Project-valikosta saatavalla Settings-komennolla (tai näppäilyllä Alt+F7). Tällöin saat esiin Project Settings valintaikkunan (kuva 27.1). Projektin pääasetukset esitetään ylimmällä tasolla ja niitä voidaan valita Settings For yhdistelmäruudusta. Valittuasi konfiguraatioasetuksen ikkunan oikean puolen asetuksien muutokset kohdistuvat ainoastaan tähän konfiguraatioon. Sovellusta käännettäessä se käännetään käytettävän konfiguraation asetuksin. Voit tietysti valita Settings For yhdistelmäruutuun All Configurations, jolloin tehdyt asetusten muutokset sekä kääntäminen kohdistuu kaikkiin konfiguraatioihin. Uutta projektia luodessa tuetaan sekä Debug- että Release asetuksia; nämä konfiguraatiot tuottavat varsin erilaista objektikoodia. Debugtilassa ohjelman kääntämisellä saadaan suuri ja melko hidas suoritettava ohjelma. Syy tähän on ohjelmaan lisättyjen debuggaustietojen määrä sekä kääntäjän optimoinnin puuttuminen.

OSA VII LUKU 27 655 KUVA 27.1 Project Settings valintaikkunan C/C++-välilehti. Kun käännät saman ohjelman Release-tilassa, saat pienen ja nopean suoritettavan ohjelman, mutta et pääse tutkimaan sitä rivi riviltä etkä saa siltä debuggaussanomia. Tavallisesti sovellusta kehitettäessä kääntäjä jätetään Debug-tilaan, jotta ohjelmakoodin ongelmatilanteet löytyisivät helposti. Kun sovellus on saatu julkaisuvalmiiksi, konfiguraatio voidaan muuttaa Releasetilaan, jolloin sen käyttäjille saadaan pieni ja nopea versio. KATSO MYÖS Lisätietoja projektin hallinnasta ja konfiguraatioista luvusta 2. Debuggausvalintojen ja -tasojen asettaminen Voit asettaa debuggausvalintoja ja tasoja Project Settings valintaikkunan C/C++-välilehdeltä. Tämä valintaikkunan sivu saadaan esiin valitsemalla Project-valikosta Settings (tai näppäilemällä Alt+F7) ja valitsemalla ikkunasta C/C++-välilehti. Kun sivulla on valittu Category-ruudussa General (yleiset asetukset), ikkunassa voidaan valita seuraavat asetukset: Warning Level. Tämä määrittää käännöksen aikana annetun virhevaroitustason. Käytettävissä ovat taulukon 27.1 esittämät asetukset. Oletustaso näistä on Level 3, joka on varsin herkkä, vaikka useat C++-ohjelmoijat suosittavat jopa Level 4:n käyttöä, jotta kääntäjä varoittaisi vielä uhkaavista potentiaalisista ongelmista. Level 1 ja None valinnat sopivat vain erityiskäyttöön, koska ne ilmoittavat ainoastaan vakavista virheistä (tai eivät ilmoita). Testaaminen Releasetilassa Sovellus tulee testata täysin vielä release-kääntämisen jälkeenkin. Mahdolliset ongelmat saattavat liittyä Debug-tilassa käytettyjen (ja Release-tilassa poistettujen) ASSERT-makrojen käyttöön (josta lisää myöhemmin tässä luvussa) tai nopeuden ja muistin optimointiin. Level 4 -tason varoitukset Varoitustasoa Level 4 käytettäessä huomaat myös Microsoftin oman AppWizardin tekemän koodin antavan varoituksia (vaikkakin yleensä vain käyttämättömistä funktion parametreistä, mikä voidaan jättää huomiotta).

656 Kehittyneet tekniikat Warnings as Errors. Valitsemalla tämän kääntäjän varoitukset tulkitaan kääntämisen pysäyttäviksi virheiksi. Generate Browser Info. Kun valitset tämän asetuksen, kääntäjä luo tietoja auttamaan projektin funktioiden, symbolien ja luokkasuhteiden löytämistä Browse-ikkunassa (josta lisää seuraavassa kappaleessa). Valitettavasti näiden tietojen luominen kasvattaa selvästi käännösaikaa, varsinkin laajoissa projekteissa (joissa näitä tietoja juuri tarvitaan). Debug Info. Tässä voit valita, kuinka paljon kääntäjä tekee debuggaustietoja. Valinnat on esitetty taulukossa 27.2. Optimizations. Debug-tilassa nämä jätetään yleensä valitsematta, koska ne sotkevat debuggausta ja hidastavat kääntämistä. Release-tilassa voit kuitenkin valita, haluatko sovellukseltasi mahdollisimman hyvää suorituskykyä (Maximize Speed) vai pientä kokoa (Minimize Size) vai ehkä oletusarvoa, jolloin pyritään keskitienä molempiin. Preprocessor Definitions. Tässä syötetään ohjelmaa käännettäessä määriteltävät #define-makrot. Voit hyödyntää näitä määrittelyjä yhdessä koodin #ifdef, #else ja #endif esikäsittelijän komentojen kanssa kääntämään koodilohkon ainoastaan määrätyssä konfiguraatossa. Debug-tilassa annetaan automaattisesti _DEBUG-määrittely. Tätä voidaan hyödyntää rajaamaan koodilohkon kääntäminen ainoastaan Debug-tilaan seuraavasti: int a= b * c / d + e; #ifdef _DEBUG CString strmessage; strmessage.format( Result of sum was %d,a); afxmessagebox(strmessage); #endif Tässä sanomaruutukoodi käännetään ja suoritetaan ainoastaan, kun sovellus on käännetty Debug-tilassa. Kun siirrytään Releasetilaan, lohkon koodia ei edes käännetä suoritettavaan tiedostoon. Project Options. Itse kääntäjä suoritetaan konsolisovelluksena ja se muuttaa Developer Studion asetukset komentoriviltä syötettäviksi lipuiksi. Voit lisätä käyttöliittymästä puuttuvia eksoottisempia lippuja vielä näihin komentorivilippuihin tässä tekstiruudussa.

TAULUKKO 27.1 Kääntäjän varoitustasot OSA VII LUKU 27 657 Taso None Level 1 Level 2 Level 3 Level 4 Ilmoitetut varoitukset Ei ilmoiteta Ainoastaan kaikkein vakavimmat Myös joitakin vähemmän vaarallisia Oletustaso (kaikki merkittävät varoitukset) Hyvin herkkä (sopii perfektionisteille) TAULUKKO 26.2 Debug Info asetukset Asetus None Line Numbers Only C 7.0 Compatible Program Database Program Database for Edit and Continue Tuotetut debuggaustiedot Ei tuota debuggaustietoja varattu yleensä Release-tilalle Tämä tuottaa ainoastaan lähdekoodiin viittaavat rivinumerot funktioita ja yleisiä muuttujia varten. Etuna on käännösajan ja exe-tiedoston koon pysyminen kohtuullisena. Tämä tuottaa Microsoft C7.0 yhteensopivat debuggaustiedot. Kaikki debuggaustiedot sijoitetaan suoritettaviin tiedostoihin niiden kokoa kasvattaen, mutta täysi symbolinen debuggaus onnistuu. Tällä asetuksella käännettäessä luodaan.pdbpäätteinen tiedosto, jossa on enimmäismäärä debuggaustietoa. Edit and Continue tietoja ei kuitenkaan luoda. Tämä on oletusasetus ja tavallisimmin käytetty. Se tuottaa.pdb-tiedoston, jossa on enimmäismäärä debuggaustietoa sekä luo uuden Edit and Continue ominaisuuden vaatimat tiedot. Kääntäjän lippujen vaikutus Jokainen projektin asetus muutetaan pitkäksi luetteloksi kääntäjän komentorivilippuja. Esimerkiksi Debug info -asetus muutetaan esilaisiksi /Zkomentorivivalinnoiksi. Nämä ovat: /Zd vain rivinumeroille, /Z7 kääntäjän versio 7:n yhteensopivuudelle, /Zi ohjelmatietokannalle ja /Zl Edit and Continue -tilaa varten. Jos muutat Debug info -asetuksia, muutokset näkyvät myös Project Options - ruudussa.

658 Kehittyneet tekniikat Selaustietojen luominen ja käyttö Source Browser työkalulla voit tutkia lähdekoodiasi yksityiskohtaisesti. Tämä työkalu saattaa olla suorastaan korvaamaton jonkun ulkopuolisen tekemää koodia tutkittaessa tai käsiteltäessä omaa koodia pitkän tauon jälkeen. Saat Source Browser työkalun käyttöön kääntämällä sovelluksen Generate Browse Info asetus valittuna (Project Settings ikkunan C/C++-välilehdellä). Voit käynnistää työkalun näppäilemällä Alt+F12 tai valitsemalla Tools-valikosta Source Browser (ensimmäisellä suorituskerralla sinua pyydetään kääntämään selaustiedot). Ensimmäinen Source Browser ohjelman esittämä valintaikkuna pyytää syöttämään sen ohjelman osan Identifier-nimen, jota selataan (kuva 27.2). Tämä voi olla esimerkiksi sovelluksessa olevan luokan, tietorakenteen, funktion, globaalin tai paikallisen muuttujan nimi. Syötettyäsi nimitunnisteen OK-painike tulee käyttöön ja pääset selaamaan tuon tunnisteen lisätietoja. KUVA 27.2 Browse-valintaikkunassa pyydetään selattavaa nimeä. Select Query luettelosta voit valita, missä muodossa tieto haetaan valitusta nimestä. Voit valita seuraavista vaihtoehdoista: Definitions and References. Tällä valinnalla näytetään kaikki tiedostot, joista on viitattu kyseiseen nimeen ja tieto siitä, onko kyseessä viittaus (reference), eli nimen käyttö koodissa, vai nimen määrittely (identifier). Esimerkki tästä on esitetty kuvassa 27.3. Tiedostonimen lisäksi luettelossa esitetään myös rivinumerot. Jos kaksoisnapautat esitettyä tiedostonimeä, esitetään viitattu ohjelmakoodi Developer Studion editori-ikkunassa. Tämä on erityisen hyödyllinen tutkittaessa tietyn muuttujan tai funktion käyttöä.

OSA VII LUKU 27 659 KUVA 27.3 Source Browser esittää viittaukset ja määrittelyt. File Outline. Tällä valinnalla esitetään kaikki (Identifierruutuun) annetussa tiedostossa määritellyt luokat, data, funktiot, makrot ja tyypit (kuva 27.4). Voit poistaa tai ottaa mukaan valitun tyyppiset tiedot ylärivin painikkeilla. KUVA 27.4 Lähdekoodiselaimen File Outline näyttö. Base Classes and Members. Tämä on eittämättä lähdekoodiselaimen käyttökelpoisimpia valintoja. Kun annat identifiernimeksi luokan, esitetään koko luokkahierarkia ja kunkin tason jäsenfunktiot ja muuttujat (kuva 27.5). Voit myös ottaa mukaan ainoastaan tietyntyyppiset jäsenfunktiot ja muuttujat.

660 Kehittyneet tekniikat KUVA 27.5 Lähdekoodiselaimen Base Classes and Members näkymä. Derived Classes and Members. Myös tämä näkymä on käyttökelpoinen esittäen kaikki annetusta luokasta johdetut luokat sekä niiden omat jäsenfunktiot ja muuttujat. Tällä valinnalla pääset myös tutustumaan paremmin MFC-luokkakirjaston rakenteeseen, kun annat Identifier-nimeksi CWnd (kuva 27.6). KUVA 27.6 Lähdekoodiselaimen Derived Classes and Members näkymä esittää CWnd-luokasta johdetut luokat. Call Graph. Funktiokutsuverkko, joka esittää kaikki annetun nimen kutsumat funktiot sekä kutsuttujen funktioiden määrittely- ja toteutustiedostot. Tämän avulla voit näppärästi seurata ohjelman kulkua. Callerr Graph. Vastaavalla Callers Graph valinnalla näytetään kaikki annettua nimeä kutsuvat funktiot. Tämän avulla voit jäljittää määrätyn funktiosi kutsujat.

OSA VII LUKU 27 661 Etädebuggaus ja ajonaikainen debuggaus Debuggerin työkalujen avulla voit debugata myös etätietokoneessa ajettavaa ohjelmaa (jopa Internetin kautta TCP/IP:llä). Tämä on hyödyllistä, kun haluat testata ohjelmaasi erilaisessa laiteympäristössä kuin ohjelmankehitykseen tarkoitettu tietokone. Tätä varten tarvitset molempiin koneisiin täsmälleen samat.exe ja dll-tiedostot käytetyistä ohjelmista. Projektin lataamisen jälkeen voit debugata ohjelmaa etätietokoneen jaetusta hakemistosta muuttamalla Executable for debug session tekstiruutuun paikallisen.exe tiedoston hakemistopolun ja tiedostonimen (löytyy Project Settings valintaikkunan Debug-välilehdeltä). Joudut lisäämään myös Debug-välilehden alaosaan hakemistopolun.exe-tiedostoon Remote Executable Path and File Name tekstiruutuun ja jättämään Working Directory ruudun tyhjäksi. Sitten voit käynnistää etätietokoneessa debuggerin seurantaohjelman käynnistämällä MSVCMON.EXE ohjelman ja kytkeytymällä paikallisesta koneesta siihen Build-valikon Debugger Remote Connection komennolla. Remote Connection valintaikkunasta valitaan Local, jos debuggaukseen käytetään jaettua hakemistoa, ja Remote, kun debuggaus tehdään TCP/IP-yhteyden kautta (etätietokoneen osoite syötetään Settings-painikkeella saadussa ikkunassa). Tämä valinta kytkee Developer Studion etätietokoneen debuggerin seurantaohjelmaan (remote monitor), joka käynnistää istunnon. Ajonaikainen debuggaus (Just-in-time debugging) mahdollistaa tavalliseen tapaan suoritetun (ei siis debuggerilla) ohjelman debuggaamisen siinä ilmenneen ongelman tapahtuessa. Jos tietokoneeseesi on asennettu Visual C++ ja tämä valinta on sallittu, mikä tahansa kesken ajon kaatunut ohjelma ladataan uuteen Developer Studion istuntoon valmiiksi debugattavaksi ja kaatumisen aiheuttanut koodi esitetään. Tämä aiheuttaa mielenkiintoisen tilanteen, jos kaatunut ohjelma on itse Developer Studio. Tällöin ladataan ajettavaksi toinen Developer Studion istunto ja saat esiin sen ohjelman assembly-kielisen koodin, jonka kaatuminen debuggerissa kaiken aiheutti. Omien sovellusten debuggaaminen on niiden kaatuessa (niitä demottaessa?) hyödyllistä. Ajonaikainen debuggaus sallitaan Tools-valikon Options-komennolla saadun ikkunan Debug-välilehdeltä valitsemalla Just-in-time debugging. Etädebuggaustiedostojen asentaminen Tarvitset etätietokoneeseen seuraavat tiedostot debuggeriseurantaohjelmaa varten: MSVCMON.EXE, MSVCRT.DLL, TLN0T.DLL, DM.DLL, MSVCP6O.DLL ja MSDIS110.DLL. Nämä tiedostot löytyvät Visual Studion hakemiston alta hakemistosta.\common\msdev98\bin.

662 Kehittyneet tekniikat Tällä sivulla OLE RPC valinta on myös hyödyllinen kehitettäessä COMja DCOM-sovelluksia, koska se sallii debuggerin seurata ohjelmansuoritusta toiseen ohjelmaan tai.dll:ään ja antaa toisen debuggerin huolehtia toisesta prosessista. Oma debuggeri saa debuggauksen hallinnan takaisin etäfunktion suorituksen jälkeen. Tällainen debuggaus toimii verkon yli ja jopa erilaisissa tietokoneissa. KATSO MYÖS Lisätietoja COM:ista ja OLE:sta luvusta 25. Ehdolliset keskeytyskohdat Voit asettaa keskeytyskohtiin (breakpoint) ehtoja, jolloin saat niistä hyvin tehokkaita vianhakutyökaluja. Ehdot voivat tarkistaa muuttujan arvoja tai ne voidaan asetaa ohittamaan keskeytyskohta muutaman kerran ennen tietylle riville pysähtymistä. Ohjelmansuorituksen seuranta ja yksittäisaskellus Eräs Visual C++:n debuggausympäristön hyödyllisimmistä ominaisuuksista on vuorovaikutteinen koodirivien yksittäisaskellus. Tämä tarkoittaa ohjelmakoodin suorittamista rivi kerrallaan ja samalla muuttujien arvojen tutkimista. Voit asettaa ohjelmaan myös keskeytyskohtia (breakpoint), jolloin ohjelma suoritetaan keskeytyskohdaksi merkitylle koodiriville saakka ja ohjelmansuoritus pysäytetään. Voit tutkia tällöin haluamiasi muuttujia ja jatkaa tämän jälkeen ohjelmansuoritusta. TRACE- ja ASSERT-lauseiden käyttö auttaa myös ohjelman vianhaussa. TRACE-lauseilla voidaan esittää tekstiä ja muuttujien arvoja ohjelmasta, kun kyseinen lause suoritetaan. ASSERT-lauseella ohjelma saadaan pysähtymään, ellei testattava ehto ole tosi (TRUE), vaikka sen tulisi olla. TRACE-makron käyttö Voit lisätä eri paikkoihin ohjelmaasi TRACE-makroja kertomaan sitä ajettaessa, että kyseinen rivi on suoritettu tai esittämään muuttujan arvoa tuossa vaiheessa. TRACE-makrot käännetään ohjelmaasi Debugkonfiguraatiota käytettäessä ja niiden tuloste näytetään Developer Studion alareunan ikkunan Debug-välilehdellä ajettaessa ohjelmaa debuggerin alaisuudessa. Voit jättää ohjelmakoodiisi TRACE-makrot myös Release-tilassa käännettäessä, koska nämä makrot jätetään tällöin automaattisesti pois käännöksestä. Yksinkertaisten tekstisanomien tai muuttujien arvojen näyttäminen

onnistuu syöttämällä muotoilumerkkijono TRACE-makron ensimmäiseksi parametriksi. Tämän formaatti on aivan sama kuin printf()- tai CString::Format() funktiolla käytettävä. Jos tekstin seassa halutaan esittää kokonaislukuja, niiden paikka merkitään %d:llä, heksadesimaaliluvut %x:llä ja merkkijonot %s:llä. Seuraavat parametrit vastaavat sitten kukin yhtä näistä muotoilukoodeista. Esimerkiksi seuraava koodi: int nmynum = 60; char* szmystring = This is my String ; TRACE( Number = %d, or %x in hex and my string is: %s\n, nmynum, nmynum, szmystring); Tuottaa seuraavan tulosteen: Number = 60, or 3c in hex and my string is This is my string Listauksessa 27.1 esitettyä TRACE-makroa on käytetty esittämään merkkijono ennen ja jälkeen yksinkertaisella, mutta tehottomalla menetelmällä suoritetun lajittelun jälkeen. OSA VII LUKU 27 663 Jos haluat kokeilla listauksen 27.1 koodia, voit tehdä AppWizardilla yksinkertaisen SDI-sovellusrungon. Lisää listauksen koodi dokumenttiluokkasi toteutustiedostoon ennen OnNewDocument()- funktiota ja kutsuu sitten DoSort()-funktiota OnNewDocument()- funktiosta käsin. Voit suorittaa sovelluksen debuggerissa (valitse Build-valikosta Start Debug ja alivalikosta Go) nähdäksesi TRACE-lauseen tulosteen. Varmista vielä, että Output-ikkuna on näkyvissä (valitse Viewvalikosta Output) ja siitä Debug-välilehti päällimmäisenä. LISTAUS 27.1 LST27_1.CPP Yksinkertainen sort-funktio debuggerin käytön havainnollistamiseksi 1 void Swap(CUIntArray* pdwnumbers,int i) 1 2 { 3 UINT uval = pdwnumbers->getat(i); 4 pdwnumbers->setat(i,pdwnumbers->getat(i+1)); 5 pdwnumbers->setat(i+1,uval); 6 } 7 8 void DoSort() 9 { 10 CUIntArray arnumbers; 11 for(int i=0;i<10;i++) arnumbers.add(1+rand()%100); 12 Debuggauksen pikanäppäin Nopein tapa käynnistää debuggaus on painaa F5- näppäintä. Tämä käynnistää ohjelman suorittamisen debuggerissa (mikäli suoritettava tiedosto on ajan tasalla) tai pyytää kääntämään uusimmat lähdekooditiedostot ennen jatkamista. 1 Swap()-funktio vaihtaa kaksi muuttujaa taulukon peräkkäisistä paikoista.

664 2 TRACE-makrolla tulostetaan numero ennen järjestämistä. 3 Jokainen numeropari tarkistetaan ja jos järjestys on väärä, ne vaihdetaan. 4 Numerot tulostetaan jälleen TRECE-makrolla järjestämisen jälkeen. Kehittyneet tekniikat 13 TRACE("Before Sort\n"); 2 14 for(i=0;i<arnumbers.getsize();i++) 15 TRACE("[%d] = %d\n",i+1,arnumbers[i]); 16 17 BOOL bsorted; 18 do 19 { 20 bsorted = TRUE; 21 for(i=0;i<arnumbers.getsize()-1;i++) 22 { 23 if (arnumbers[i] > arnumbers[i+1]) 3 24 { 25 Swap(&arNumbers,i); 26 bsorted = FALSE; 27 } 28 } 29 } while(!bsorted); 30 31 TRACE("After Sort\n"); 4 32 for(i=0;i<arnumbers.getsize();i++) 33 TRACE("[%d] = %d\n",i+1,arnumbers[i]); 34 } Listauksessa 27.1 järjestetään rivillä 11 luotu satunnaislukutaulukko (lukuarvot 1 100). Riveillä 13 15 tulostetaan taulukon sisältö TRACE-lauseella ennen taulukon järjestämistä. Riveillä 17 29 taulukko järjestetään vaihtamalla väärässä järjestyksessä olevat parit keskenään (kutsumalla rivillä 25 Swap()-funktiota). Riveillä 1 6 esitetty Swap()-funktio käyttää parametreinä osoitinta taulukkoon ja sijaintia siinä ja vaihtaa kaksi tuossa taulukon paikassa olevaa lukua keskenään. Järjestämisen jälkeen taulukon sisältö tulostetaan uudelleen Outputikkunaan rivin 31 33 TRACE-lauseilla. Tämän ohjelman TRACE-lauseiden tulostus näkyy Developer Studion Output-ikkunassa taulukon 27.3 mukaisesti. Järjestämisalgoritmi Vaikka tämä järjestämisalgoritmi sopiikin hyvin debuggaamisen havainnollistamiseen, se lienee järjestämisalgoritmeista tehottomimpia. Jos tarvitset tehokasta järjestämistä, tutki quicksort-algoritmia, joka on toteutettu C++-kirjaston qsort()-funktioksi. TAULUKKO 27.3 Sort-ohjelman tulostus Ennen Jälkeen [1] = 42 [1] = 1 [2] = 68 [2] = 25 [3] = 35 [3] = 35 [4] = 1 [4] = 42 [5] = 70 [5] = 59 [6] = 25 [6] = 63 [7] = 79 [7] = 65

OSA VII LUKU 27 665 Ennen Jälkeen [8] = 59 [8] = 68 [9] = 63 [9] = 70 [10] = 65 [10] = 79 ASSERT- ja VERIFY-makrojen käyttö ASSERT-makroa käytetään, kun halutaan varmistaa, että tietty ehto on tosi. Makrolle annetaan yksi parametri, ehtolause, joka voi olla joko TRUE tai FALSE. Jos ehtolause on tosi (TRUE), mitään ei tapahdu. Jos ehto on epätosi (FALSE), ohjelma pysähtyy ja Debug Assertion Failed valintaikkuna esitetään (kuva 27.7). Tässä voit valita, haluatko lopettaa ohjelman suorituksen (Abort), debugata sovellusta (Retry) vai olla huomioimatta ilmoitusta (Ignore). Ikkunassa esitetään myös ohjelma, lähdekoodirivi sekä lauseen rivinumero. Jos valitset Abort, debuggausistunto keskeytetään. Retry on luultavasti käyttökelpoisin näistä valinnoista, koska tällöin kääntäjä näyttää ohjelmakoodin, jossa ASSERT-makro epäonnistui, jolloin voit tutkia, mikä vian aiheutti. Jos asia on jo selvä tai et halua huomioida ilmoitusta, voit valita Ignore ja jatkaa ohjelman suorittamista mikä tosin saattaa johtaa vielä vakavampiin virheisiin. KUVA 27.7 Debug Assertion Failed ikkunasta voit hakea ohjelmavikoja. ASSERT-makroa käytetään usein syöttöparametrien tarkistamiseen. Voit esimerkiksi parantaa Swap()-funktion luotettavuutta (listauksessa 27.1) tutkimalla sen syöttöparametrit. Lisää tätä varten Swap()- funktion alkuun seuraavat ASSERT-makrot: ASSERT(pdwNumbers); ASSERT(i>=0 && i<10);

666 Kehittyneet tekniikat Tämä varmistaa, että osoitin taulukkoon ei ole NULL ja että paikka taulukossa on väliltä 0 9. Mikäli jompikumpi ehto ei pidä paikkaansa, esitetään Debug Assertion Failed ikkuna. Tällä tekniikalla voit selvittää virheellisistä syöttöparametreistä johtuvia virheitä. On hyvä tapa tarkistaa aina funktion syöttöparametrit, jotta ne vastaisivat odotettuja arvoja. Toinen vastaava makro, ASSERT_VALID, on käytettävissä CObjectkantaluokasta johdettujen luokkien kanssa (esimerkiksi kaikki MFCluokat). Tämä tarkistaa olion ja sen sisällön läpikotaisemmin varmistaen, että koko olio on kunnossa ja oikeassa tilassa. Voit syöttää tälle makrolle osoittimen olioon esimerkiksi näin: Muita sijoiitusmakroja Vähemmän käytettyjä sijoitusmakroja (assert...) on muun muassa ASSERT_POINTER, joka käyttää parametreinä osoitinta ja sen viittaamaa tieto/oliotyyppiä. ASSERT_POINTER varmistaa, ettei osoitin ole NULL ja varaa muistia ja tarkistaa, että olio sopii siihen. Vastaava sijoitustesti on myös ASSERT_NULL_OR_POINTER, joka sallii NULL-osoittimet, muttei osoittimia olioihin, jotka käyttävät nykyiselle prosessille käymättömiä muistiosoitteita. ASSERT_VALID(pdwNumbers); Toinen ASSERT-tyyppinen makro ASSERT_KINDOF, jota myös käytetään CObject-kantaluokasta johdettujen olioiden kanssa, tarkistaa, onko luokka oikeaa tyyppiä. Jos esimerkiksi haluat tarkistaa, onko näkymäosoittimesi oikeaa näkymäluokkaa, kirjoittaisit ASSERT_KINDOF-makron näin: ASSERT_KINDOF(CYourSpecialView,pYView); Ellei luokka ole oikeaa tyyppiä tai siitä johdettua luokkaa, esitetään Assertion Failed ikkuna. Muista varoa sijoittamasta normaalissa ohjelman toiminnassa tarvittavaa koodia ASSERT-makroon, koska niitä ei käännetä Release-versioon. Esimerkki tavallisesta Release-tilan vaikeasti jäljitettävästä koodausvirheestä on tällainen: int a = 0; ASSERT(++a >0); if (a>0) MyFunc(); Debug-käännöksessä tämä koodi kasvattaa kokonaislukua ASSERTrivillä ja kutsuu sitten MyFunc()-funktiota seuraavalla rivillä, koska a on nollaa suurempi. Koska firmasi myyntimiehet ovat halukkaita esittelemään ohjelmaa ja koska Debug-tilassa ei näyttänyt olevan ongelmia, päätät kääntää ohjelmasta Release-version. Tämä versio toimitetaan sitten myyntimiehille, jotka esittävät sen tulevalle asiakkaalle ja ohjelma kaatuu komeasti. Syy tähän on, että ++a lausetta ei suoriteta eihän Release-tilassa käännetä ASSERT-lauseita. VERIFY-makro auttaa tähän ongelmaan. Se toimii Debug-tilassa aivan samoin kuin ASSERT-makro ja näyttää saman Assertion Failed ikkunan, mikäli syötetty lause on 0 (FALSE). Lause suoritetaan kuitenkin Release-tilassa, mutta nollatuloksesta ei näytetä Assertion-ikkunaa. VERIFY sopiikin käytettäväksi, kun sille syötetty lause halutaan

suorittaa aina ja ASSERT, kun lause halutaan tarkistaa ainoastaan debugattaessa. Tästä syystä edellisen esimerkin ASSERT-makron korvaaminen VERIFY:lla saa myös Release-version toimimaan oikein: VERIFY(++a > 0); Useammin VERIFY-makroja näkee kuitenkin käytettävän funktioiden paluuarvoja tarkistettaessa: VERIFY(MyFunc()!= FALSE); OSA VII LUKU 27 667 Keskeytyskohtien ja ohjelman yksittäisaskelluksen käyttö Suurimpaan osaan ohjelmavioista tehoaa parhaiten ohjelman yksittäisaskellus (single stepping) ja keskeytyskohtien (breakpoint) käyttö. Visual C++ tukee hyvin edistyneitä keskeytyskohtatyyppejä ja yksittäisaskellustietoja ja toivottavasti onnistun antamaan tämän debuggaustyökalun tehosta edes vähän esimakua. Yksittäisaskelluksen keskeinen osa on keskeytyskohtien käyttö. Voit asettaa keskeytyskohdan mihin tahansa kohtaan koodiasi ja ajaa sitten ohjelmaa debuggerissa. Kun keskeytyskohta saavutetaan, ohjelmakoodi merkitystä kohdasta näytetään editori-ikkunassa ja voit jatkaa ohjelman suorittamista siitä lause kerrallaan tai ajamista jatkamalla. Keskeytyskohta lisätään määrätylle koodiriville valitsemalla rivi (napauttamalla osoitin kyseiselle riville editorissa) ja napauttamalla tämän jälkeen Build-työkalurivin (kuva 27.8) Breakpoint-kuvaketta tai F9-näppäintä. Monimutkaisemmat keskeytyskohdat voidaan asettaa Edit-valikon Breakpoints-komennolla esitettävässä ikkunassa (kuva 27.9). Kun lisäät keskeytyskohdan, se esitetään pienenä punaisena pisteenä valitun rivin vieressä. Keskeytyskohdan on oltava todellisessa suoritettavassa lauseessa, joten joskus Developer Studio siirtää keskeytyskohdan lähimmälle tällaiselle riville. KUVA 27.8 1 35 Keskeytyskohdan lisääminen koodiisi Build-pienoistyökalurivillä tai F9-näppäimellä. 2 4 1 Käännä (Compile, Ctrl+F7) 2 Koosta (Build, F7) 3 Lopeta koostaminen (Stop Build, Ctrl+Break) 4 Aja (Go, F5) 5 Lisää/poista keskeytyskohta

668 Kehittyneet tekniikat KUVA 27.9 Keskeytyskohdan lisääminen Breakpoints-valintaikkunasta. Voit lisätä tai poistaa keskeytyskohdan napauttamalla vastaavaa (käden muotoista) kuvaketta tai poistaa sen Breakpoints-valintaikkunan Remove- tai Remove All painikkeella. Keskeytyskohdat voidaan jättää merkityiksi, mutta poistaa käytöstä poistamalla sen valinnan Breakpoints-luettelosta. Uudelleen napauttamalla valintaruutu merkitään ja keskeytyskohta aktivoidaan. Asetettuasi keskeytyskohdat voit ajaa ohjelmaa debuggerissa valitsemalla Build-valikon Start Debug alivalikosta Go. Voit myös napauttaa Go-kuvaketta (Breakpoint-kuvakkeen vasemmalla puolen, kuva 27.8) tai näppäillä F5. Ohjelmaa ajetaan normaalisti, kunnes keskeytyskohta saavutetaan. Tällöin ohjelma pysähtyy ja keskeytyskohta esitetään nuolella. Tässä vaiheessa voit jatkaa yksittäisaskeltamista (step) Debug-työkaluriviltä, kuten kuvassa 27.10 esitetään. Tarvittaessa saat tämän työkalurivin esiin napauttamalla hiiren oikealla painikkeella ikkunan yläosan työkalurivien paikalla ja valitsemalla pikavalikosta Debug. KUVA 27.10 Keskeytyskohtaan pysähtynyt debuggeri on valmis yksittäisaskellukseen Debugtyökaluriviltä. Kun debuggerissa on pysäytetty ohjelman suorittaminen, pääset tutkimaan muuttujien arvoja yksinkertaisesti kuljettamalla osoitinta niiden yli editori-ikkunassa. Tällöin muuttujan arvo näkyy työkaluvih-

jeen tavoin osoittimen kohdalla. Lisää yksityiskohtia saat, jos raahaat muuttujan Watch-ikkunaan (tästä lisää seuraavassa kappaleessa). Voit yksittäisaskeltaa koodin lauseita käyttäen Debug-työkalurivin neljää aaltosulkukuvaketta tai valitsemalla vastaavan toiminnon Debug-valikosta. Eri askellusvaihtoehdot on esitetty taulukossa 27.4. Nämä kaikki löytyvät sekä Debug-työkaluriviltä että Debug-valikosta. TAULUKKO 27.4 Yksittäisaskellusvaihtoehdot Kuvake/Valinta Näppäin Toiminta OSA VII LUKU 27 669 Step Into F11 Debuggeri suorittaa nykyisen rivin ja mikäli kyseessä on funktiokutsu, suoritta mista jatketaan tuon funktion sisällä. Step Over F10 Kuten Step Into, mutta funktiokutsun kohdalla tuo funktio suoritetaan normaalinopeudella ja sen jälkeen ohjelmansuoritus pysäytetään, jolloin näyttää kuin suorituksessa olisi hypätty funktion ylitse. Step Out vaihto+f11 Debuggeri suorittaa funktio loppuosan normaalilla nopeudella ja pysähtyy, kun funktiosta palataan kutsuvaan funktioon. Run to Cursor Ctrl+F10 Ohjelmaa suoritetaan debuggerissa, kunnes määräämäsi osoittimen sijainti saavutetaan. Tämä sijainti voidaan merkitä hiirellä ohjelmariviä napauttamalla. Go F5 Ohjelmansuoritusta jatketaan seuraavaan keskeytyskohtaan saakka. Stop Debugging vaihto+f5 Debuggerin käyttö lopetetaan ja palataan muokkaustilaan.

670 Kehittyneet tekniikat Kuvake/Valinta Näppäin Toiminta Restart Ctrl+vaihto+F5 Tällä valinnalla ohjelma käynnistetään uudelleen alusta ja pysähdytään ensimmäiselle riville. Break Execution Tällä valinnalla debuggerissa normaalisti ajettava ohjelma pysäytetään. Apply Code Changes Alt+F10 Jos olet tehnyt muutoksia koodiin debuggauksen aikana, voit tällä valinnalla kääntää koodin ja jatkaa debuggaamista samasta paikasta. Näillä valinnoilla voit seurata ohjelmansuorituksen kulkua ja muuttujien arvoja koodin muokatessa niitä. Editori-ikkunan keltainen nuoli osoittaa aina, mikä lause suoritetaan seuraavaksi. Seuraavassa kappaleessa kerrotaan ohjelmansuorituksen pysähdyttyä käytettävissä olevista debuggeri-ikkunoista. Edit and Continue toiminnan käyttö Eräs Visual C++ 6.0 uusista hienoista ominaisuuksista on nimeltään Edit and Continue (muokkaa ja jatka). Tämä tarkoittaa, että voit muokata koodia ohjelman ollessa pysäytettynä debuggeri-ikkunassa. Muokkaamisen jälkeen saat käyttöön Debug-valikon Apply Code Changes komennon (ja työkalurivin painikkeen ). Tämän valitsemalla koodiin tekemäsi muutokset käännetään ja voit jatkaa debuggaamista uutta muuttunutta koodia käyttäen. Tätä ominaisuutta hyödyntäen voit korjata viat debuggauksen aikana ja jatkaa debuggaamista samasta kohden samoin muuttujien arvoin kuin ennen muokkaamista. Tämä on erityisen hyödyllistä laajoissa ja mutkikkaissa ohjelmissa. Ohjelman muuttujien seuraaminen Kuvassa 27.11 esitetään Watch- ja Variables-ikkunat. Näissä ikkunoissa esitetään muuttujien arvot, kun ohjelmansuoritus debuggerissa on

keskeytetty. Saat nämä ikkunat tarvittaessa esiin View-valikon Debug Windows valikosta tai työkalurivin painikkeilla tai. OSA VII LUKU 27 671 KUVA 27.11 Watch-ikkunassa esitetään muuttujien arvot debuggauksen aikana. 1 Watch-ikkuna 2 Muuttujat 3 Context-yhdistelmäruutu 1 2 3 Variables-ikkuna esittää aina ikkunan yläosan Context-yhdistelmäruudussa esitetyn funktion paikalliset muuttujat. Löydät tarvittavan funktion avaamalla yhdistelmäruudun ja hakemalla funktion juuri kutsuttujen funktioiden luettelosta. Kyseessä on funktiokutsupino (Call Stack), jossa esitetään kaikki pysäytyskohtaan pääsemiseksi tarvitut funktiokutsut. Kun valitset toisen funktion, ikkunassa esitettäviksi vaihtuvat vastaavat muuttujat. Voit laajentaa olio-osoittimen napauttamalla nimen vieressä olevaa plusmerkkiä. C++:n this-osoitin näytetään aina luokan jäsenfunktioita varten ja sen laajentamalla saat esiin kaikki nykyisen olion jäsenmuuttujat. Watch-ikkunassa voit syöttää muuttujien nimiä näppäimistöltä tai raahata muuttujan nimen ikkunaan suoraan editorista (kun olet nimen ensin hiirellä valinnut). Esitettävien muuttujien arvot näytetään niin kauan kuin ne ovat voimassa (eli sillä hetkellä debugattavan funktion käytettävissä). Lausekkeiden avaaminen QuickWatchilla Voit käyttää QuickWatch-ikkunaa laskimena, johon voidaan syöttää matemaattisia ja loogisia lausekkeita mukaan lukien ohjelman muuttujat arvoineen. Kun Recalculate-painiketta painetaan, lausekkeen arvo esitetään Current Value - ruudussa.

672 Kehittyneet tekniikat Voit syöttää Watch-ikkunassa myös yksinkertaisia taulukon indeksejä tai tyyppimuunnosoperaattoreita (cast). Hiiren oikealla painikkeella voit muuttaa näytettävän arvon kokonaislukumuodosta heksadesimaaliseksi ja päinvastoin. Kun askellat ohjelmaa eteenpäin, Watch- ja Variable-ikkunoissa esitettävien muuttujien arvot päivitetään ja voit seurata, kuinka ohjelmansuoritus muuttaa muuttujien arvoja. Assembly-koodin yksittäisaskellus Kun Disassembly-ikkuna on esillä, debuggeri käy läpi assembly-koodin käsky kerrallaan. Assembly-koodi ja vastaava toimintakoodi ovat suoritettavan koodisi tavuja, jotka edustavat CPU-käskyjä. Assembly-koodin askellus käsky kerrallaan on hidasta ja raskasta, mutta se selittää tarkkaan, miksei ohjelmasi toimi kuten pitäisi. Se on lisäksi usein ainoa tapa löytää vikoja itse kääntäjän tekemästä koodista. Kääntäjä saattaa joskus erehtyä optimoidessaan ja kääntäessään mutkikasta lähdekoodia. Muita debuggerin ikkunoita Muut debuggerin ikkunat saadaan esille View-valikon Debug Windowsalivalikosta valitsemalla tai vaihtoehtoisesti Debug-työkaluriviltä. Nämä ikkunat ovat: QuickWatch. Napauttamalla muuttujaa luettelosta ja valitsemalla QuickWatch (tai näppäilemällä vaihto+f9) saadaan valitun muuttujan sisältö esiin. Voit myös syöttää muuttujan nimen suoraan ja siirtää sen seurattavaksi Watch-ikkunaan Add Watch painikkeella. Registers. Registers-ikkunassa esitetään CPU:n rekisterien senhetkiset arvot. Tästä ei liene merkittävää hyötyä, ellet ratko assembly-kielisen koodin ongelmia. Memory. Memory-ikkunassa esitetään sovelluksen muistialue sarakkeittain: ensimmäisessä on osoite, toisessa muistipaikkojen arvot heksadesimaalisena ja kolmannessa samat merkkeinä. Voit muuttaa pikavalikosta esitysmuodon Bytetyyppisestä myös Short tai Long-tyyppisiksi. Call Stack. Call Stack ikkunassa näytetään luettelo funktioista, joita on kutsuttu ennen kuin nykyiseen funktioon on päästy sekä kullekin funktiolle syötetyn parametrit. Tästä on hyötyä erityisesti jäljitettäessä ohjelmansuoritusta nykyiseen funktioon saakka. Jos kaksoisnapautat luettelon funktiota, näet editori-ikkunassa paikan funktiosta, missä kyseistä funktiota kutsuttiin. Jos lähdekoodia ei ole saatavilla, funktiokutsut näyttävät seuraavalta: KERNEL32! bff88f75() Tällaista alkiota napautettaessa näytetään C++-koodin sijaan assembly-koodia.

OSA VII LUKU 27 673 Disassembly. Jos valitset työkaluriviltä tai valikosta Disassembly-komennon, voit vaihtaa näytettäväksi pelkkää C++-koodia tai sekä C++:aa että assembly-koodia. Jos C++kielistä lähdekoodia ei ole saatavilla, näytetään pelkästään assembly-koodia. Muita debuggaustyökaluja Sisäänrakennettujen debuggaustyökalujen lisäksi kääntäjän mukana on myös useita itsenäisiä, mutta käyttökelpoisia debuggausohjelmia. Saat käynnistettyä näitä Tools-valikosta valitsemalla. Näillä työkaluilla seurataan usein tiettyjä Windowsin osia, kuten sanomia, suoritettavia prosesseja tai rekisteröityjä OLE-objekteja. Näin saadaan vielä lisätietoa sovelluksen debuggaamiseen. Spy++ Spy++ on epäilemättä näistä työkaluista käyttökelpoisimpia. Spy++:lla voit nähdä lapsi- ja isäikkunoiden hierarkian, ikkunoiden asemat ja liput sekä ikkunan kantaluokan. Voit myös seurata ikkunalle lähetettäviä sanomia. Kun käynnistät Spy++:n ensimmäisen kerran, se näyttää kaikki työpöydän ikkunat, niiden osat sekä kunkin ikkunan kantaluokan (kuva 27.12). Kuvan 27.12 näkymää on vieritetty näyttämään Windowsin CD Player apuohjelman tiedot. Spy++ näyttää kaikki painikkeet ja yhdistelmäruudutkin, jotka ovat itsekin lapsi-ikkunoita CD Player pääikkunassa.

674 Kehittyneet tekniikat KUVA 27.12 Spy++:n alkunäyttö Windowsin työpöydältä CD Player -osa esitettynä. Jos napautat Spy-valikkoa, saat esiin seuraavat komennot: Messages. Huomaat tämän pian erääksi Spy++:n parhaista toiminnoista, sillä voit seurata kaikille ikkunoille lähetettyjä sanomia (myös omalle sovelluksellesi). Voit myös valita vain osan sanomista näytettäväksi, sillä esimerkiksi hiiren liike saa aikaan suuren joukon sanomia. Sanomien seuraamiseksi valitse tämä komento ja saat esiin Message Options ikkunan (kuva 27.13). Tästä ikkunasta voit raahata Finder-osoittimen seurattavan ikkunan päälle. Osoitinta siirrettäessä se näyttää vielä tietoja osoitettavasta ikkunasta. Spy++ korostaa tämän lisäksi osoitettavan ikkunan, josta erottuvat vielä kehysikkuna ja ikkunan työalue (client). Kun olet paikantanut oikean ikkunan, vapauta hiiren painike ja ikkuna on valittu. Tässä vaiheessa pääset käyttämään ikkunan toisia välilehtiä valitaksesi mahdollisesti vain osan sanomista näytettäviksi sekä asettaaksesi esitettävän tiedon muotoa. Kun olet valmis, sulje Message Options ikkuna OK:lla. Kuvassa 27.14 esitetty Spy++-ohjelman tulostus näyttää tavallisen SDI-sovelluksen työkalurivin käytön tuottamia sanomia. Kuten huomaat, kaikkia sanomia tarkkailemalla hiiren liike ja osoittimen tarkistus saavat suuren osan tulostusalasta. Onneksi mukana on myös tuttu WM_LBUTTONUP paikkaparametreineen.

OSA VII LUKU 27 675 KUVA 27.13 Spy++:n Message Options ikkunan Finder-osoittimella valitaan tutkittava ikkuna. KUVA 27.14 Työkalurivin käytöstä tulevia Spy++:n kirjaamia Windowsin sanomia. Windows. Kuvassa 27.12 on esitetty Windows-näkymä on Windowsin työpöydän rakenne- ja asettelunäkymä. Jos kaksoisnapautat luettelon ikkunan nimeä, saat esiin ominaisuussivun, jossa esitetään kaikki valitun ikkunan paikka- ja lipputiedot. Tämän tiedon päivittämiseksi tarvitset Windows-valikon Refresh-komentoa. Processes. Saat esiin kaikki ajossa olevat prosessit (ohjelmat) Processes-näkymästä. Kukin prosessi voidaan vielä laajentaa esittämään sen säikeet (thread) sekä siihen liittyvät ikkunat. Threads. Sama kuin Processes ilman prosessien nimiä. Tällä näet kaikki ajossa olevat säikeet (ohjelmien suoritusputket) sekä säikeiden omistamat ikkunat. Spy++-työkalussa on enemmän ominaisuuksia kuin tässä mahtuu käsittelemään, mutta Windowsin rakenteen ja sanomien ymmärtämisessä se on vertaansa vailla. Saat paljon arvokasta tietoa jo tutkimalla tavallista kaupallista sovellusta Spy++:lla. Se on myös oiva

676 Kehittyneet tekniikat debuggaustyökalu selvitettäessä sanomista johtuvia ongelmia; Spy++:lla näet, saavatko ikkunasi oikeita sanomia ja missä järjestyksessä sanomat tulevat. KATSO MYÖS Lisätietoja Windowsin sanomista luvusta 4. Process Viewer Näet prosessien tiedot Spy++:aa tarkemmin Process Viewer ohjelmalla (PView95.exe tai Pview.exe). Löydät tämän sovelluksen Windowsin päävalikosta valitsemalla Käynnistä/Ohjelmat/Microsoft Visual Studio 6.0 Tools valikon (Start/Programs/ Microsoft Visual Studio 6.0 Tools). Tällä sovelluksella näet koneessasi ajossa olevat prosessit ja voit lajitella niitä sarakkeen otsikkoa napauttamalla (PView95). Prosessia napauttamalla saat näkyviin alempaan ikkunaan sen säikeet. Kuvassa 27.15 on esitetty Process Viewer, jossa on valittu Developer Studio prosessi sen säikeiden näyttämiseksi. KUVA 27.15 Process Viewer näyttää MSDEV.EXEn ja sen säikeet. OLE/COM Object Viewer OLE/COM Object Viewer työkalulla näytetään kaikki järjestelmään rekisteröidyt OLE/COM-objektit, mukaan lukien ActiveX-kontrollit, tyyppikirjastot, upotettavat objektit, automaatio-objektit sekä monet muut ryhmät. Ohjelmasta käsin voit jopa luoda eri objektien ilmentymiä ja tutkia yksityiskohtaisesti niiden liittymiä. OLE/COM Object Viewer sopii käytettäväksi OLE/COM-sovelluksia kehitettäessä sekä vaikeasti selvitettävien ActiveX-kontrollien tutkimiseen.

KATSO MYÖS Lisätietoja ActiveX-kontrollien käytöstä sovelluksissasi luvusta 9. Lisätietoja ActiveX-kontrollien luomisesta luvusta 26. Yksityiskohtia COMista ja OLEsta luvusta 25. OSA VII LUKU 27 677 MFC Tracer Kuvan 27.16 MFC Tracer työkalulla voit estää normaalin TRACEmakron käytön tai lisätä normaaliin TRACE-tulostukseen lisätietoja. Tämän työkalun käynnistäessäsi saat esiin joukon valintaruutuja, joita valitsemalla tai valintoja poistamalla tulostettavien TRACE-tietojen määrää voidaan muuttaa. Voit lisätä seurattavaksi tietoja Windowsin sanomista, tietokantasanomista, OLE-sanomista sekä muista helpottaaksesi hankalien ongelmien ratkaisemista. MFC-koodi luo nämä sanomat asetettujen lippujen mukaan. Voit jopa poistaa tavallisen TRACE-tulostuksen käytöstä poistamalla Enable Tracing valinnan. KUVA 27.16 MFC Tracer työkalun valinnat.

678 Kehittyneet tekniikat