2009-01-31 5 views
14

Quando si utilizza windbg e si esegue il comando dumpheap per visualizzare gli indirizzi degli oggetti, come è possibile limitare a un numero specifico di oggetti. L'unico modo che ho trovato era usare CTRL + BREAK e una riga di comando su un blog http://dotnetdebug.net/2005/07/04/dumpheap-parameters-and-some-general-information-on-sos-help-system/Limite! Dumpheap (windbg) output su n oggetti

-l X - Stampa solo gli elementi X da ogni heap invece di tutti gli oggetti.

Apparentemente -l non esiste più in Sos.dll

+1

So che questa è una vecchia questione, ma siete riusciti a capire una risposta? –

risposta

5

Cosa stai realmente cercando? Prima di guardare i singoli oggetti, è usuale restringere l'area di interesse.

L'opzione -stat mostra un riepilogo, per tipo di oggetti sull'heap.

dumpheap [-stat] [-min] [- max] [-thinlock] [-MT] [tipo] [start [fine]]

  • L'opzione -stat limita l'output al riepilogo del tipo statistico.
  • L'opzione -min ignora gli oggetti che sono inferiori al parametro size, specificato in byte.
  • L'opzione -max ignora gli oggetti che sono più grandi del parametro size, specificato in byte.
  • L'opzione -thinlock segnala ThinLocks. Per ulteriori informazioni, consultare il comando SyncBlk.
  • L'opzione -mt elenca solo gli oggetti che corrispondono alla struttura MethodTable specificata.
  • L'opzione -tipo elenca solo gli oggetti il ​​cui nome tipo è una corrispondenza di sottostringa della stringa specificata.

Il parametro di avvio inizia l'elenco dall'indirizzo specificato. Il parametro end arresta l'elenco all'indirizzo specificato.

Ref.

+0

Sto cercando singoli oggetti. -stat -min 100 -max 150 mi mostra 150K + piccoli oggetti. –

+9

SUGGERITE avete 150k voci tutte della stessa dimensione e tipo (come nel mio caso) - come mai riuscite a trovare un singolo indirizzo di una di esse? Se stampi la lista completa che sei condannato, c'è ora modo di interrompere l'elenco per i prossimi 30 minuti (eccetto uccidere il processo) – bitbonk

6

In base a quali criteri si desidera limitare il numero di uscite? L'opzione -l limita semplicemente l'uscita in base ai numeri di riga. Questo è inutile: diciamo che mostra solo i primi 10 oggetti, forse l'oggetto che stai cercando non è nemmeno elencato.

Se l'output è troppo lungo per la finestra di output di WinDbgs, utilizzare .logopen per eseguire il dump degli oggetti in un file e quindi rivedere il file con un editor di testo.

Se avete altre idee come il vostro oggetto assomiglia, è possibile eseguire un ciclo su tutti gli oggetti

.foreach (obj { !dumpheap -short -type MyType}) 

e poi decidere con .if o meno l'oggetto soddisfa questo criterio.

Ad esempio, stavo cercando un ago in un pagliaio. Stavo cercando una Hashtable specifica in un programma con più di 3000 Hashtables sullo heap. Il comando I provato ad utilizzare era

.foreach (obj { !dumpheap -short -type Hashtable }) {.if (poi(poi(${obj}+1c)) > 100) {!do ${obj}} } 

1C è l'offset del membro conteggio del tabella hash.

100 è il numero di voci che l'Hashtable avrebbe dovuto avere almeno.

Sfortunatamente non ha funzionato per Hashtables immediatamente, perché !dumpheap -type elencava anche HashtableEnumerators che in qualche modo causava il crash del debugger.

per scaricare hashtables solo, eseguire !dumpheap -stat e capire la tabella di modalità di tabelle hash ed eseguire il comando con -mt <methodtable> invece di -type <classname>, che dà

.foreach (obj { !dumpheap -short -mt <MT of Hashtable> }) {.if (poi(poi(${obj}+1c)) > 100) {!do ${obj}} } 
+1

Per i futuri lettori: dovresti essere in grado di usare '-mt' con l'indirizzo della tabella dei metodi di 'HashTable'. Ottenete queste informazioni eseguendo '! Dumpheap -stat' e quindi cercate' HashTable' per l'indirizzo della tabella dei metodi. – xxbbcc

+0

@xxbbcc: hai ragione. Nel frattempo lo uso anche io. Aggiornata la risposta. –

+0

Grazie per l'aggiornamento. La tua risposta è stata molto utile nel rintracciare una perdita di memoria. – xxbbcc