Onnistuuko .NET-työkaluilla sellainen tarkka lokitiedosto, jossa näkyy paljon yksityiskohtaisia tietoja? Koodasin pienen ohjelman, joka luo sellaisen tarkan lokitiedoston ja tiedoston sisälmykset ovat tässä:
[2012/5/11 17:13:40] Information: Program started, entering 'void main()' [2012/5/11 17:13:40] Information: Entering 'void Void1(string par)' [2012/5/11 17:13:42] Warning: Registry settings not found [2012/5/11 17:13:42] Information: Leaving 'void Void1(string par)' [2012/5/11 17:13:42] Information: Entering 'void Void2(object args[])' [2012/5/11 17:13:43] Error: Cannot load settings [2012/5/11 17:13:43] Information: Leaving 'void Void2(object args[])' [2012/5/11 17:13:43] Information: Leaving 'void main()', program stopped
Eli tein vain pari subia ja niihin lokikäsittelijän kutsuja. Mutta se olisi aika iso työ laittaa noita kutsuja joka paikkaan, joten päätin kysyä täältä, miten se onnistuu, jos onnistuu.
Lähtökohtana olisi, että ohjelman alkuun voisi laittaa vaikka komennon Logger.StartLogging()
ja tuo aloittaisi loggailun.
Miten tämä onnistuu?
Kuvaamasi kaltaista ohjelmaa nimitetään usein profiloijaksi, eli englanniksi profiler. Jos et haluakaan tällaista ohjelmaa, saat kuvata toiveitasi tarkemmin. Arvelin kuitenkin, että sellainen voisi kiinnostaa. Suoritin nopean nettihaun. Hakutermillä ".net profiler" löytyi tämä kysymys ja sen vastaukset Stack Overflow'sta:
http://stackoverflow.com/questions/3927/what-are-some-good-net-profilers
Siellä suositeltiin muiden mahdollisuuksien ohella Eqatecin profiloijaa, josta on myös ilmaisversio tarjolla:
http://www.eqatec.com/Profiler/
Overview-sivun nojalla tämä työkalu tuottaisi juuri sellaista tietoa kuin haluat. Se on toki ulkoinen ohjelma, mutta haittaako se? Sille näyttäisi itse asiassa olevan ohjelmointirajapintakin tarjolla, joten voit ehkä kustomoida sitä toimimaan kuten haluat omasta koodistasi.
Koska sitä voi kokeilla ilmaiseksi, voit itse jatkaa tästä ja arvioida, sopiiko se käyttöösi. Minä en ole itse sitä kokeillut, vaan kuten sanoin, löysin sen juuri hakemalla.
Vaikuttaa olevan tuo profiloija.
Itse haluaisin tuosta sellaisen, että tietty prosessi valvoo kaikkia ohjelmia ja ohjelmat viestivät toisilleen DLL-tiedoston kautta. Asiakasohjelmassa olisi yksi käsky alussa, joku Dll-funktio joka käynnistää säikeen tiedonvälitykseen ja profilointiin. Jos jompi kumpi prosesseista loppuu, tulee erroria.
Yleensä profiloinnit keskittyy muistinkäsittelyyn tai suorituskykyyn, harvemmin varsinaisen ohjelmarungon lokitukseen tai vastaavaan. Yleensä puhutaan Tracinginstä, kun halutaan seurata ohjelmakulkua (ja tähän tarkoitukseen on valmiitakin luokkia .NET:ssä), ja lokittaa sen perusteella.
Perustietoa on netti pullollaan:
http://www.exforsys.com/tutorials/vb.net-2005/vb.net-2005-tracing-a-windows-application.html
http://www.vbdotnetheaven.com/uploadfile/
TraceListener tuntuu sopivalta. Kiitos.
EDIT: Siinäkin joutuu kirjoittamaan ohjelmaan ylimääräisiä käskyjä. Tarkoitin kuuntelijaa, jonka pitäisi saada tietoa ohjelman suorituksesta (esim. jos vaikka hypätään johonkin aliohjelmaan, kuuntelija huomaisi sen ja kirjoittaisi lokiin). Saattaa mennä jo debuggerin puolelle.
Mihin muuten tarvitset sitä?
Yksinkertaisesti virheiden etsimiseen ja jäljittämiseen. Onhan se nyt helpompaa kun tietää että milloin menee mämmiin, kuin että tulee vaan ilmoitus että ohjelma kaatui ja joku stacktrace siinä ilmoituksessa.
Error: Out of memory. at Program.Startup(string args[]) at Program.CheckSettings()
[13/5/2012 21:11:46] Information: Started [13/5/2012 21:11:46] Warning: Settings not found [13/5/2012 21:11:46] Error: Out of memory. at Program.Startup(string args[]) at Program.CheckSettings() [13/5/2012 21:11:46] Information: Stopping
Alempihan on paljon selkeämpi.
ErroR++ kirjoitti:
Onhan se nyt helpompaa kun tietää että milloin menee mämmiin, kuin että tulee vaan ilmoitus että ohjelma kaatui ja joku stacktrace siinä ilmoituksessa.
Tuo stack trace yleensä kertoo kyllä aika hyvin missä homma menee metsään. Mielestäni on turhaa kirjoittaa kaikkea ohjelman suoritustietoa lokiin, kun tuota tietoa tulee nopeasti aivan älytön määrä.
Itse olen aina pärjännyt aika hyvin pelkästään dumppaamalla call stackin ja lokaalit muuttujat näkyville virhetilanteen sattuessa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.