2009-01-31 9 views
14

Al usar windbg y ejecutar! Dumpheap comando para ver las direcciones de los objetos, ¿cómo se puede limitar a un número específico de objetos. La única manera que encontré estaba usando CTRL + INTER y una línea de comandos en un blog http://dotnetdebug.net/2005/07/04/dumpheap-parameters-and-some-general-information-on-sos-help-system/Limitar! Dumpheap (windbg) salida a n objetos

-l X - Imprime sólo los elementos X de cada montón en lugar de todos los objetos.

Al parecer -l ya no existe en Sos.dll

+1

Sé que esto es una cuestión de edad, pero lograste averiguar una respuesta? –

Respuesta

5

¿Qué estás buscando realmente? Antes de mirar objetos individuales, es habitual reducir el área de interés.

El modificador -stat muestra un resumen, por tipo de los objetos en el montón.

dumpHeap [-stat] [-min] [- max] [-thinlock] [-mt] [-type] [iniciar [final]]

  • La opción -stat restringe la salida al resumen del tipo estadístico.
  • La opción -min ignora objetos que son menores que el parámetro de tamaño, especificado en bytes.
  • La opción -max ignora objetos que son más grandes que el parámetro de tamaño, especificado en bytes.
  • La opción -ininlock informa ThinLocks. Para obtener más información, consulte el comando SyncBlk.
  • La opción -tt enumera solo aquellos objetos que corresponden a la estructura de MethodTable especificada.
  • La opción -type enumera solo aquellos objetos cuyo tipo de nombre es una coincidencia de subcadena de la cadena especificada.

El parámetro de inicio comienza a listar desde la dirección especificada. El parámetro final se detiene en la lista en la dirección especificada.

Ref.

+0

Estoy buscando objetos individuales. -stat -min 100 -max 150 me muestra 150K + objetos pequeños. –

+9

Supongamos que tiene 150k entradas del mismo tamaño y tipo (como en mi caso). ¿Cómo diablos puede encontrar una sola dirección de una de ellas? Si imprime la lista completa, está condenado al fracaso. Ahora hay forma de interrumpir el listado durante los siguientes 30 minutos (excepto matar el proceso) – bitbonk

6

¿De acuerdo con qué criterios desea limitar el número de salidas? La opción -l solo limita la salida de acuerdo con los números de línea. Esto es inútil: digamos que muestra solo los primeros 10 objetos, tal vez el objeto que estás buscando ni siquiera está en la lista.

Si la salida es demasiado larga para la ventana de salida de WinDbgs, use .logopen para volcar los objetos en un archivo y luego revise el archivo con un editor de texto.

Si tiene otras ideas de cómo el objeto se parece a, puede realizar un bucle sobre todos los objetos

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

y luego decidir con .if si o no su objeto coincide con este criterio.

Como ejemplo, estaba buscando una aguja en un pajar. Estaba buscando una Hashtable específica en un programa con más de 3000 Hashtables en el montón. El comando Traté de usar era

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

1C es el desplazamiento del miembro de recuento de la tabla hash.

100 es la cantidad de elementos que se espera que tenga el Hashtable al menos.

Lamentablemente no funcionó para Hashtables inmediatamente, porque !dumpheap -type también enumeró HashtableEnumerators que de alguna manera colapsó el depurador.

para volcar tablas hash única, ejecute !dumpheap -stat y averiguar la tabla de métodos de tablas hash y ejecute el comando con -mt <methodtable> en lugar de -type <classname>, lo que da

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

Para futuros lectores: debería poder usar '-mt' con la dirección de la tabla de métodos de 'HashTable'. Obtiene esa información ejecutando '! Dumpheap -stat' y luego busca' HashTable' para la dirección de la tabla de métodos. – xxbbcc

+0

@xxbbcc: Tienes razón. Mientras tanto uso eso también. Actualizado la respuesta. –

+0

Gracias por la actualización. Su respuesta fue muy útil para rastrear una fuga de memoria. – xxbbcc

Cuestiones relacionadas