2016-08-09 3 views
0
.foreach (runtime {!da 00000086c74c3b70 }) 
{             
    .foreach(obj {!dumpobj poi(poi(${runtime})+0x8)}) 

    { 
     .if(0 == $sicmp("${obj}", "abcdxxxxxxx")) 
     { 

      .echo ***** 
      !dumpobj poi(poi(${runtime})+0x8) 
      !dumpobj poi(${runtime}) 
      !dumpobj poi(${runtime}+0x8)              
      .echo ***** 
      } 

    } 
} 

Я запускаю код выше с помощью windbg, и процесс windbg потреблял почти всю память моего компьютера (6G), и не выпустил бы его, даже приведенный выше сценарий выполнялся. BTW, результаты! Da 00000086c74c3b70 составляют около 8000 строк Мои вопросы: как освободить память или предотвратить утечку памяти?Ошибка утечки памяти при запуске сценария windbg

+1

'.foreach ...! dumpobj', кажется, не имеет смысла. '! dumpobj' работает на одном объекте. Чего вы ожидаете? Насколько велика свалка? 6 ГБ примерно равны размеру дампа? В зависимости от доступа к памяти WinDbg может считывать эти части дампа в память, и он будет обрабатываться, как в любой другой программе. –

+0

Размер дампа около 1G, каждый элемент массива - это ведро, которое имеет следующий макет, 'private struct bucket { \t public object key; \t общественный объект val; \t общественного ИНТ hash_coll;} \t ' И тип ключа, который является одним из области ковшом, является класс, который содержит строку field.So результата пои (пои ($ {} выполнения) + 0x8)} является адресом экземпляра строки для одного из полей ключа, поэтому результаты! Dumpobj poi (poi ($ {runtime}) + 0x8) содержат много полей, кроме самой строковой константы, поэтому я использовал. foreach (obj {! dumpobj poi (poi ($ {runtime}) + 0x8)}) для фильтрации. – Jason

+0

BTW, я ссылаюсь на следующий URL-адрес, чтобы написать сценарий windbg [debuggingtoolbox] (https://blogs.msdn.microsoft.com/debuggingtoolbox/2010/08/13/windbg-script-displaying-parameters-for-microsoft- reportingservices-reportprocessing /) – Jason

ответ

0

позволяет шаг за шагом идти результат да следующим
как вы можете сделать .foreach на это без фильтрации

.foreach будет проходить Имя:, System.Int32, MethodTable, 621ff680 ....
[0] ,,, [п], [фактический адрес] в сценарии и не удивительно windb г
пытается как ад на прочитать дерьмо от имени, System.Int32 строки и пытаются сбросить их в качестве объекта
я бы сказал, даже если у вас есть 60 гб это не было бы достаточно, если вы .foreach, как это займет некоторое время читать документы

0:004> !da 016e1da4 
Name:  System.Int32[] 
MethodTable: 621ff680 
EEClass:  61e3fd78 
Size:  300(0x12c) bytes 
Array:  Rank 1, Number of elements 72, Type Int32 
Element Methodtable: 621ff6bc 
[0] 016e1dac 
[1] 016e1db0 
[2] 016e1db4 
[3] 016e1db8 

вы, вероятно, хотите сделать .foreach на 16e1dac, DB0, db4, db8 и т.д. ??

если так ваша первая линия должна быть имитируя этот ИЭ
вместо дд место l1 вы должны использовать ваш {? пои ($ {место})} независимо
также убедитесь, что каждый разыменования здесь на самом деле может быть разыменовываются

0:004> .foreach /pS 16 /ps 1 (place { !da 016e1da4 }) {dd place l1 } 
016e1dac 00000003 
016e1db0 00000007 
016e1db4 0000000b 
016e1db8 00000011 
016e1dbc 00000017 
016e1dc0 0000001d 
016e1dc4 00000025 

в этом примере я наклоняюсь разыменовать ничего> пои ($ {место}), потому что это Int массив

0:004> .foreach /pS 16 /ps 1 (place { !da -length 5 016e1da4 }) {? poi(${place}) } 
Evaluate expression: 3 = 00000003 
Evaluate expression: 7 = 00000007 
Evaluate expression: 11 = 0000000b 
Evaluate expression: 17 = 00000011 
Evaluate expression: 23 = 00000017 

вы не можете сделать произвольные вещи и ожидать, что вменяемые результаты

+0

Привет, Блаб, я попробую ваше решение, чтобы посмотреть, работает ли оно и отклик на вас, спасибо за ваше предложение. – Jason

+0

blabb, я отслеживаю свой путь с использованием .foreach/pS 16/ps 1, да, скорость быстрее, чем раньше, однако утечка памяти сохраняется и не будет автоматически отпущена. – Jason