Beyond F5 - windbgYann Schwartz -  blog.polom.com  - yann@polom.com
Oui mais pourquoi ?Déboguer dans la nature,diagnostiquer les problèmesavec un outil le plus léger possible.
Windbg   - cdb - kdDebuggingtools for Windows http://microsoft.com/whdc/devtools/debuggingAu départ, un debugger natif (user mode et kernel), frontal de bibliothèques bas niveau.windbg : debugger « graphique » cdb + kd (kernel debugger)cdb (console debugger) : idem que windbg mais en pure ligne de commande et user mode seulementkd: kernel debugger (ligne de commande)Pas d’installation nécessaire (le répertoire décompressé par l’installeur se suffit à lui-même)
sos et sosexsos (Son of Strike) 	extension pour le code managélivré avec chaque version du frameworksosex	extension non MS de sosSteve Johnson - http://www.stevestechspot.com/
sosThis is how the world ends,not with a bangbut a whimper.		(TS Eliot – the Hollow men)This is how sosbegins,not with a whimperbut a bang.!Help
Avant de commencer.loadbysosmscorwkscharge la version de sos correspondant à la version du CLR de l’appli.loadsosexcharge sosex (doit être dans le répertoire de windbg/cdb).cmdtree[path]\cmd_tree.txtmenu de racourcis personnalisable
Commandes amusantes!DumpHeap –stat Instances du tas, regroupées par type, triées par taille totale!ThreadsListe des threads managed!runaway 7Exécute l’appli et classe les threads par temps CPU utilisé
Encore des commandes! SyncBlkListe des locks pris ou attendus! ClrStack [-a|-l|-p]Call stack CLR du thread courant, et variables et arguments courants!GCRootaddrListe récursive des instances qui font que l’instance à [addr] reste en vie
Toujours plus haut~nInfos sur le thread n~nsPasser au thread n~e*!ClrStack –aExécuter une commande sur tous les threads
sosex!dlkDétection automatique des deadlocks!refsaddrListe des  références de et vers l’instance à addr!mln addrType de l’objet CLR à l’adresse addr
InterludeUne brève histoire des langages de programmation user unfriendly
APLhttp://en.wikipedia.org/wiki/APL_%28programming_language%29X[⍋X+.≠' ';]
J		http://en.wikipedia.org/wiki/J_%28programming_language%29quicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^:(1<#) times=: (1 5&(+/ .*)@:* , (+/ .* |.)) " 1pow  =: 4 : 'times/ 1 0 , times~^:(I.|.#:y) x' " 1 0f8a  =: {. @ (0 1r5&times) @ (-/) @ ((1r2 1r2,:1r2 _1r2)&pow)f8b  =: {:@(1 1x&pow) % 2x&^@<:
Brainfuckhttp://en.wikipedia.org/wiki/Brainfuck,>,>++++++[-<--------<-------->>] <<[                               >[->+>+<<]                        >[-<<-                            [>]>>>[<[>>>-<<<[-]]>>]<<]        >>>+                              <<[-<<+>>]                        <<<]                              >[-]>>>>[-<<<<<+>>>>>]            <<<<++++++[-<++++++++>]<.
Scripts windbg~*e r? $t0 = @$teb; r? $t1 = @$t0+8; r? $t2 = @$t0+4; kv 100; dps poi(@$t1) poi(@$t2)ad /q * .printf "\n Data Table : ${$arg1} \n"; .foreach (DataColumn {!do poi(poi(poi(${$arg1}+0x18)+0x8)+0x4) -v -short}){    .printf "     Data Column : ${DataColumn} \t";    $$    !do poi(${DataColumn}+0x28)    !dumpfield -field_columnName ${DataColumn} -string}.printf "\n";
This isyourbrain on windbgscripting
PowerdbgFrontal Powershell de pilotage de windbghttp://www.codeplex.com/powerdbgpowershell  –(stdin/out)->  cdb  –(tcp)->   windbgFonctions simples pour lancer des commandesSortie standard de cdb traitée ligne à ligneScripts (et moteur) écrits en Powershell (une trentaine de scripts existants)
Un script Powerdb$null = Invoke-WindbgCommand .loadby sos mscorwks$output = Invoke-WindbgCommand ("!dumpheap -type " +     "System.Management.Automation.InvocationInfo -short") foreach($line in $output) {     Resolve-Member $line commandInfo.name     Resolve-Member $line scriptToken._script    Resolve-Member $line scriptToken._line} Disconnect-Windbg
LinqdbgVaporwarewww.polom.com/linqdbglinqdbg (.Net) -> cdbvarobjs = from instance inLinqdbg.HeapStats()             whereinstance.Type.IsAssignableFrom(typeof(Toto))             orderbyinstance.TotalSizedesc;             varleaked = from instance inobjs             	         selectinstance.GCRoot();
RessourcesDebugging MS .Net 2.0 Applications, MS Press, John RobbinsWindows Internals 5th edition, MS Press, Mark RussinovitchBlog de Tess FerrandezBlog de John Robbinswww.codeplex.com/powerdbgwww.polom.com/linqdbg

Beyond F5 - windbg et .Net

  • 1.
    Beyond F5 -windbgYann Schwartz - blog.polom.com - yann@polom.com
  • 2.
    Oui mais pourquoi?Déboguer dans la nature,diagnostiquer les problèmesavec un outil le plus léger possible.
  • 3.
    Windbg - cdb - kdDebuggingtools for Windows http://microsoft.com/whdc/devtools/debuggingAu départ, un debugger natif (user mode et kernel), frontal de bibliothèques bas niveau.windbg : debugger « graphique » cdb + kd (kernel debugger)cdb (console debugger) : idem que windbg mais en pure ligne de commande et user mode seulementkd: kernel debugger (ligne de commande)Pas d’installation nécessaire (le répertoire décompressé par l’installeur se suffit à lui-même)
  • 4.
    sos et sosexsos(Son of Strike) extension pour le code managélivré avec chaque version du frameworksosex extension non MS de sosSteve Johnson - http://www.stevestechspot.com/
  • 5.
    sosThis is howthe world ends,not with a bangbut a whimper. (TS Eliot – the Hollow men)This is how sosbegins,not with a whimperbut a bang.!Help
  • 6.
    Avant de commencer.loadbysosmscorwkschargela version de sos correspondant à la version du CLR de l’appli.loadsosexcharge sosex (doit être dans le répertoire de windbg/cdb).cmdtree[path]\cmd_tree.txtmenu de racourcis personnalisable
  • 7.
    Commandes amusantes!DumpHeap –statInstances du tas, regroupées par type, triées par taille totale!ThreadsListe des threads managed!runaway 7Exécute l’appli et classe les threads par temps CPU utilisé
  • 8.
    Encore des commandes!SyncBlkListe des locks pris ou attendus! ClrStack [-a|-l|-p]Call stack CLR du thread courant, et variables et arguments courants!GCRootaddrListe récursive des instances qui font que l’instance à [addr] reste en vie
  • 9.
    Toujours plus haut~nInfossur le thread n~nsPasser au thread n~e*!ClrStack –aExécuter une commande sur tous les threads
  • 10.
    sosex!dlkDétection automatique desdeadlocks!refsaddrListe des références de et vers l’instance à addr!mln addrType de l’objet CLR à l’adresse addr
  • 11.
    InterludeUne brève histoiredes langages de programmation user unfriendly
  • 12.
  • 13.
    J http://en.wikipedia.org/wiki/J_%28programming_language%29quicksort=: (($:@(<#[) ,(=#[) , $:@(>#[)) ({~ ?@#)) ^:(1<#) times=: (1 5&(+/ .*)@:* , (+/ .* |.)) " 1pow =: 4 : 'times/ 1 0 , times~^:(I.|.#:y) x' " 1 0f8a =: {. @ (0 1r5&times) @ (-/) @ ((1r2 1r2,:1r2 _1r2)&pow)f8b =: {:@(1 1x&pow) % 2x&^@<:
  • 14.
    Brainfuckhttp://en.wikipedia.org/wiki/Brainfuck,>,>++++++[-<--------<-------->>] <<[ >[->+>+<<] >[-<<- [>]>>>[<[>>>-<<<[-]]>>]<<] >>>+ <<[-<<+>>] <<<] >[-]>>>>[-<<<<<+>>>>>] <<<<++++++[-<++++++++>]<.
  • 15.
    Scripts windbg~*e r?$t0 = @$teb; r? $t1 = @$t0+8; r? $t2 = @$t0+4; kv 100; dps poi(@$t1) poi(@$t2)ad /q * .printf "\n Data Table : ${$arg1} \n"; .foreach (DataColumn {!do poi(poi(poi(${$arg1}+0x18)+0x8)+0x4) -v -short}){    .printf "     Data Column : ${DataColumn} \t";    $$    !do poi(${DataColumn}+0x28)    !dumpfield -field_columnName ${DataColumn} -string}.printf "\n";
  • 16.
    This isyourbrain onwindbgscripting
  • 17.
    PowerdbgFrontal Powershell depilotage de windbghttp://www.codeplex.com/powerdbgpowershell –(stdin/out)-> cdb –(tcp)-> windbgFonctions simples pour lancer des commandesSortie standard de cdb traitée ligne à ligneScripts (et moteur) écrits en Powershell (une trentaine de scripts existants)
  • 18.
    Un script Powerdb$null = Invoke-WindbgCommand .loadby sos mscorwks$output = Invoke-WindbgCommand ("!dumpheap-type " +     "System.Management.Automation.InvocationInfo -short") foreach($line in $output) {     Resolve-Member $line commandInfo.name     Resolve-Member $line scriptToken._script    Resolve-Member $line scriptToken._line} Disconnect-Windbg
  • 19.
    LinqdbgVaporwarewww.polom.com/linqdbglinqdbg (.Net) ->cdbvarobjs = from instance inLinqdbg.HeapStats()             whereinstance.Type.IsAssignableFrom(typeof(Toto))             orderbyinstance.TotalSizedesc;             varleaked = from instance inobjs         selectinstance.GCRoot();
  • 20.
    RessourcesDebugging MS .Net2.0 Applications, MS Press, John RobbinsWindows Internals 5th edition, MS Press, Mark RussinovitchBlog de Tess FerrandezBlog de John Robbinswww.codeplex.com/powerdbgwww.polom.com/linqdbg