vrijdag 21 december 2007

AsmProfiler

Ontstaan

AsmProfiler is ontstaan naar aanleiding van mijn ontevredenheid over de profilers die ik gebruikt heb. Ik wilde oa meer details zien, en het moest makkelijk en snel in gebruik zijn. Via een oud-collega (Thaddy, nog bedankt!) kwam ik in aanraking met "detouring". Hiermee kon ik echter nog niet direct een profiler mee maken. Daarvoor heb ik zelf dmv assembly wat meer werk moeten doen. Dit gelukkig gelukt: mijn "proof of concept" werkte!

Werkbare versie, maar nog genoeg te doen...

In het afgelopen jaar heb ik in mijn vrije tijd het concept uitgebreid tot een redelijk werkbare versie. Nog lang al mijn ideeen zijn er niet in verwerkt, dus ik hoop nog veel functionaliteit toe te voegen! Verder is de documentatie nog niet in orde, en de code moet gerefactored/opgeschoond worden (ik heb al veel concept en "hackiediehack" :-) code verbeterd).

Open source

Ik heb het ontwikkeld met de "open source" gedachte: Ik heb zelf te weinig tijd om alles zelf te programmeren, en zelf vind ik dat elke programmeur zonder gedoe een profiler moet kunnen gebruiken. Dus bij deze wil ik iedereen oproepen om mee te helpen met het programmeren :-) .

Google Code

Het project heb ik bij "Google Code" gehost: http://code.google.com/p/asmprofiler/
Daar staan oa een wikki, issue tracker, download list, etc. Tevens regelt Google de opslag etc door middel van "Subversion" als versie beheer systeem. Lekker makkelijk voor mij dus. Wil je mee helpen met de code, dan zul je waarschijnlijk eerst moeten aanmelden, en ik moet je toegang geven tot mijn project. Maar dat zie ik dan wel weer, als er iemand is die belangstelling heeft :-) .

Asmprofiler demo

Ik heb naar aanleiding van een "klacht" op de DDD gelijk een klein demo project gemaakt :-) , dat toont hoe je AsmProfiler in een willekeurig Delphi project kunt gebruiken: http://asmprofiler.googlecode.com/files/DllLoadDemo.zip
http://asmprofiler.googlecode.com/files/DllTestApps.zip

Met C en C++ is het ook gewoon mogelijk om de dll te laden, hier heb ik echter geen C header file oid voor gemaakt. Die moet je zelf even maken adhv de Delphi interface unit.

Dll injection

Als je je programma niet wilt aanpassen, of als je de profiler wilt gebruiken op een programma waar je de code niet van hebt. dan kun de je de "injection" versie gebruiken: http://asmprofiler.googlecode.com/files/AsmProfiler_inject_v10011.zip

Start hiervoor de command line tool "inject.exe", zoek via de "Windows Task Manager" of "Process Explorer" de PID van een programma op, en voer die in. Druk op enter, en de dll wordt via officieele Windows APIs in het programma geinjecteerd :-) . Het scherm van de profiler wordt getoond zodra het geinjecteerde programma "GetMessage" of "Peekmessage" aanroept (normale Windows message loop). Echter, bij sommige programma's werkt dit niet, zoals Open Office.

Gebruik

Als je de profiler dll geladen hebt en het profiler scherm ziet, dan moet je eerst aangeven welke units en functies je wilt profilen door op de "Select items" knop te drukken:

profiler.PNG

Je krijgt dan een scherm te zien met alle units uit de .map file (Delphi -> Project options -> Linker -> Map file -> Detailed). Je kunt ook kiezen om alle (of bepaalde) functies van een geladen dll te selecteren:

selectitems.PNG

Door op "Start" te drukken wordt het profilen gestart, de "Stop" knop stopt het monitoren :-) . Vervolgens kun je via "Show results" de resultaten bekijken:

results.PNG

Dubbelklikken op een item gaat naar het 2e tabblad met meer details.

Disclaimer

Uiteraard is het gebruik volledig op eigen risico :-) . Normaal gesproken moet het geen problemen geven, maar van bepaalde units weet ik dat sommige low level Delphi functies crashes veroorzaken... Zoals de "classes" unit bevat ook adressen naar (het begin van?) classes zelf ipv de functies van classes. Dit moet ik nog uitzoeken. Verder kun je beter de "system" unit ook vermijden: deze bevat veel low level functies. Het beste kun je je "eigen" units gebruiken, en de "Windows" unit is handig omdat het veel standaard Windows APIs bevat.

Geen opmerkingen: