beyond f5 - windbg et .net
TRANSCRIPT
Yann Schwartz - blog.polom.com - [email protected]
Déboguer dans la nature,
diagnostiquer les problèmes
avec un outil le plus léger possible.
Debugging tools for Windows
http://microsoft.com/whdc/devtools/debugging
Au 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 (Son of Strike) extension pour le code managélivré avec chaque version du framework
sosexextension non MS de sosSteve Johnson - http://www.stevestechspot.com/
This is how the world ends,not with a bangbut a whimper. (TS Eliot – the Hollow men)
This is how sos begins,not with a whimperbut a bang.
!Help
.loadby sos mscorwkscharge la version de sos correspondant à la version du CLR de l’appli
.load sosexcharge sosex (doit être dans le répertoire de windbg/cdb)
.cmdtree [path]\cmd_tree.txtmenu de racourcis personnalisable
!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é
! SyncBlkListe des locks pris ou attendus
! ClrStack [-a|-l|-p]Call stack CLR du thread courant, et variables et arguments courants
!GCRoot addrListe récursive des instances qui font que l’instance à [addr] reste en vie
~nInfos sur le thread n
~nsPasser au thread n
~e*!ClrStack –aExécuter une commande sur tous les threads
!dlkDétection automatique des deadlocks
!refs addrListe des références de et vers l’instance à addr
!mln addrType de l’objet CLR à l’adresse addr
Une brève histoire des langages de programmation user unfriendly
http://en.wikipedia.org/wiki/APL_%28programming_language%29
X[⍋X+.≠' ';]
http://en.wikipedia.org/wiki/J_%28programming_language%29
quicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^:(1<#)
times=: (1 5&(+/ .*)@:* , (+/ .* |.)) " 1pow =: 4 : 'times/ 1 0 , times~^:(I.|.#:y) x' " 1 0f8a =: {. @ (0 1r5×) @ (-/) @ ((1r2 1r2,:1r2 _1r2)&pow)
f8b =: {:@(1 1x&pow) % 2x&^@<:
http://en.wikipedia.org/wiki/Brainfuck
,>,>++++++[-<--------<-------->>] <<[ >[->+>+<<] >[-<<-[>]>>>[<[>>>-<<<[-]]>>]<<] >>>+ <<[-<<+>>] <<<] >[-]>>>>[-<<<<<+>>>>>] <<<<++++++[-<++++++++>]<.
~*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";
Frontal Powershell de pilotage de windbghttp://www.codeplex.com/powerdbg
powershell –(stdin/out)-> cdb –(tcp)-> windbg
Fonctions simples pour lancer des commandes
Sortie standard de cdb traitée ligne à ligne
Scripts (et moteur) écrits en Powershell (une trentaine de scripts existants)
$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._scriptResolve-Member $line scriptToken._line
}
Disconnect-Windbg
Vaporwarewww.polom.com/linqdbg
linqdbg (.Net) -> cdb
var objs = from instance in Linqdbg.HeapStats()where instance.Type.IsAssignableFrom(typeof(Toto))orderby instance.TotalSize desc;
var leaked = from instance in objsselect instance.GCRoot();
Debugging MS .Net 2.0 Applications, MS Press, John Robbins
Windows Internals 5th edition, MS Press, Mark Russinovitch
Blog de Tess Ferrandez Blog de John Robbins
www.codeplex.com/powerdbg www.polom.com/linqdbg