Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Beyond F5 - windbg et .Net

2,372 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Beyond F5 - windbg et .Net

  1. 1. Beyond F5 - windbg<br />Yann Schwartz - blog.polom.com - yann@polom.com <br />
  2. 2. Oui mais pourquoi ?<br />Déboguer dans la nature,<br />diagnostiquer les problèmes<br />avec un outil le plus léger possible.<br />
  3. 3. Windbg - cdb - kd<br />Debuggingtools for Windows<br /> http://microsoft.com/whdc/devtools/debugging<br />Au départ, un debugger natif (user mode et kernel), frontal de bibliothèques bas niveau.<br />windbg : debugger « graphique » cdb + kd (kernel debugger)<br />cdb (console debugger) : idem que windbg mais en pure ligne de commande et user mode seulement<br />kd: kernel debugger (ligne de commande)<br />Pas d’installation nécessaire (le répertoire décompressé par l’installeur se suffit à lui-même)<br />
  4. 4. sos et sosex<br />sos (Son of Strike) <br /> extension pour le code managé<br />livré avec chaque version du framework<br />sosex<br /> extension non MS de sos<br />Steve Johnson - http://www.stevestechspot.com/<br />
  5. 5. sos<br />This is how the world ends,<br />not with a bang<br />but a whimper. (TS Eliot – the Hollow men)<br />This is how sosbegins,<br />not with a whimper<br />but a bang.<br />!Help<br />
  6. 6. Avant de commencer<br />.loadbysosmscorwks<br />charge la version de sos correspondant à la version du CLR de l’appli<br />.loadsosex<br />charge sosex (doit être dans le répertoire de windbg/cdb)<br />.cmdtree[path]cmd_tree.txt<br />menu de racourcis personnalisable<br />
  7. 7. Commandes amusantes<br />!DumpHeap –stat <br />Instances du tas, regroupées par type, triées par taille totale<br />!Threads<br />Liste des threads managed<br />!runaway 7<br />Exécute l’appli et classe les threads par temps CPU utilisé<br />
  8. 8. Encore des commandes<br />! SyncBlk<br />Liste des locks pris ou attendus<br />! ClrStack [-a|-l|-p]<br />Call stack CLR du thread courant, et variables et arguments courants<br />!GCRootaddr<br />Liste récursive des instances qui font que l’instance à [addr] reste en vie<br />
  9. 9. Toujours plus haut<br />~n<br />Infos sur le thread n<br />~ns<br />Passer au thread n<br />~e*!ClrStack –a<br />Exécuter une commande sur tous les threads<br />
  10. 10. sosex<br />!dlk<br />Détection automatique des deadlocks<br />!refsaddr<br />Liste des références de et vers l’instance à addr<br />!mln addr<br />Type de l’objet CLR à l’adresse addr<br />
  11. 11. Interlude<br />Une brève histoire des langages de programmation user unfriendly<br />
  12. 12. APL<br />http://en.wikipedia.org/wiki/APL_%28programming_language%29<br />X[⍋X+.≠&apos; &apos;;] <br />
  13. 13. J<br /> http://en.wikipedia.org/wiki/J_%28programming_language%29<br />quicksort=: (($:@(&lt;#[) , (=#[) , $:@(&gt;#[)) ({~ ?@#)) ^:(1&lt;#) <br />times=: (1 5&(+/ .*)@:* , (+/ .* |.)) &quot; 1<br />pow =: 4 : &apos;times/ 1 0 , times~^:(I.|.#:y) x&apos; &quot; 1 0<br />f8a =: {. @ (0 1r5&times) @ (-/) @ ((1r2 1r2,:1r2 _1r2)&pow)<br />f8b =: {:@(1 1x&pow) % 2x&^@&lt;:<br />
  14. 14. Brainfuck<br />http://en.wikipedia.org/wiki/Brainfuck<br />,&gt;,&gt;++++++[-&lt;--------&lt;--------&gt;&gt;] <br />&lt;&lt;[ <br />&gt;[-&gt;+&gt;+&lt;&lt;] <br />&gt;[-&lt;&lt;- <br />[&gt;]&gt;&gt;&gt;[&lt;[&gt;&gt;&gt;-&lt;&lt;&lt;[-]]&gt;&gt;]&lt;&lt;] <br />&gt;&gt;&gt;+ <br />&lt;&lt;[-&lt;&lt;+&gt;&gt;] <br />&lt;&lt;&lt;] <br />&gt;[-]&gt;&gt;&gt;&gt;[-&lt;&lt;&lt;&lt;&lt;+&gt;&gt;&gt;&gt;&gt;] <br />&lt;&lt;&lt;&lt;++++++[-&lt;++++++++&gt;]&lt;.<br />
  15. 15. Scripts windbg<br />~*e r? $t0 = @$teb; r? $t1 = @$t0+8; r? $t2 = @$t0+4; kv 100; dps poi(@$t1) poi(@$t2)<br />ad /q * <br />.printf &quot; Data Table : ${$arg1} &quot;; <br />.foreach (DataColumn {!do poi(poi(poi(${$arg1}+0x18)+0x8)+0x4) -v -short}){    .printf &quot;     Data Column : ${DataColumn} &quot;;    $$    !do poi(${DataColumn}+0x28)    !dumpfield -field_columnName ${DataColumn} -string}.printf &quot; &quot;; <br />
  16. 16. This isyourbrain on windbgscripting<br />
  17. 17. Powerdbg<br />Frontal Powershell de pilotage de windbg<br />http://www.codeplex.com/powerdbg<br />powershell –(stdin/out)-&gt; cdb –(tcp)-&gt; windbg<br />Fonctions simples pour lancer des commandes<br />Sortie standard de cdb traitée ligne à ligne<br />Scripts (et moteur) écrits en Powershell (une trentaine de scripts existants)<br />
  18. 18. Un script Powerdb<br />$null = Invoke-WindbgCommand .loadby sos mscorwks$output = Invoke-WindbgCommand (&quot;!dumpheap -type &quot; +     &quot;System.Management.Automation.InvocationInfo -short&quot;) foreach($line in $output) {     Resolve-Member $line commandInfo.name     Resolve-Member $line scriptToken._script    Resolve-Member $line scriptToken._line} Disconnect-Windbg<br />
  19. 19. Linqdbg<br />Vaporware<br />www.polom.com/linqdbg<br />linqdbg (.Net) -&gt; cdb<br />varobjs = from instance inLinqdbg.HeapStats()             whereinstance.Type.IsAssignableFrom(typeof(Toto))             orderbyinstance.TotalSizedesc;             varleaked = from instance inobjs         selectinstance.GCRoot();<br />
  20. 20. Ressources<br />Debugging MS .Net 2.0 Applications, MS Press, John Robbins<br />Windows Internals 5th edition, MS Press, Mark Russinovitch<br />Blog de Tess Ferrandez<br />Blog de John Robbins<br />www.codeplex.com/powerdbg<br />www.polom.com/linqdbg<br />

×