beyond f5 - windbg et .net

20
Yann Schwartz - blog.polom.com - [email protected]

Upload: yann-schwartz

Post on 12-Jul-2015

1.637 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Beyond F5 - windbg et .Net

Yann Schwartz - blog.polom.com - [email protected]

Page 2: Beyond F5 - windbg et .Net

Déboguer dans la nature,

diagnostiquer les problèmes

avec un outil le plus léger possible.

Page 3: Beyond F5 - windbg et .Net

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)

Page 4: Beyond F5 - windbg et .Net

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/

Page 5: Beyond F5 - windbg et .Net

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

Page 6: Beyond F5 - windbg et .Net

.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

Page 7: Beyond F5 - windbg et .Net

!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é

Page 8: Beyond F5 - windbg et .Net

! 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

Page 9: Beyond F5 - windbg et .Net

~nInfos sur le thread n

~nsPasser au thread n

~e*!ClrStack –aExécuter une commande sur tous les threads

Page 10: Beyond F5 - windbg et .Net

!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

Page 11: Beyond F5 - windbg et .Net

Une brève histoire des langages de programmation user unfriendly

Page 12: Beyond F5 - windbg et .Net

http://en.wikipedia.org/wiki/APL_%28programming_language%29

X[⍋X+.≠' ';]

Page 13: Beyond F5 - windbg et .Net

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&times) @ (-/) @ ((1r2 1r2,:1r2 _1r2)&pow)

f8b =: {:@(1 1x&pow) % 2x&^@<:

Page 14: Beyond F5 - windbg et .Net

http://en.wikipedia.org/wiki/Brainfuck

,>,>++++++[-<--------<-------->>] <<[ >[->+>+<<] >[-<<-[>]>>>[<[>>>-<<<[-]]>>]<<] >>>+ <<[-<<+>>] <<<] >[-]>>>>[-<<<<<+>>>>>] <<<<++++++[-<++++++++>]<.

Page 15: Beyond F5 - windbg et .Net

~*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";

Page 16: Beyond F5 - windbg et .Net
Page 17: Beyond F5 - windbg et .Net

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)

Page 18: Beyond F5 - windbg et .Net

$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

Page 19: Beyond F5 - windbg et .Net

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();

Page 20: Beyond F5 - windbg et .Net

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