Как отладить Windbg? (Как получить информацию о том, что делает Windbg)

Как многие из вас знают, Windbg можно использовать для отладки программ, но теперь я хотел бы сделать прямо противоположное: я хотел бы отладить то, что я делаю в Windbg, позвольте мне показать вам, почему:

Я нашел интересный нативный визуализатор, содержащий следующие записи:

<Type Name='CMap&lt;*,*,*,*&gt;'>
  <AlternativeType Name="CMapStringToString"/>                 
  <AlternativeType Name="CMapStringToPtr"/>                    
  <DisplayString>{{size = {m_nCount} }}</DisplayString>         
  <Expand>                                                     
    <CustomListItems>                                          
      <Variable Name='pHashtable' InitialValue='m_pHashTable'/>
      <Variable Name='hashtable_index' InitialValue='0'/>      
      <Variable Name='pList' InitialValue='*m_pHashTable'/>    
      <Variable Name='i' InitialValue='0'/>                    
      <Loop Condition='hashtable_index &lt; m_nHashTableSize'> 
        <Exec>pList = pHashtable[hashtable_index]</Exec>       
        <Loop Condition='pList '>                              
          <Item Name='{i}: [{pList->key}]'>pList->value</Item> 
          <Exec>pList = pList->pNext</Exec>                    
          <Exec>++i</Exec>                                     
        </Loop>                                                
        <Exec>++hashtable_index</Exec>                         
      </Loop>                                                  
    </CustomListItems>                                         
  </Expand>                                                    
</Type>                                                        

<Type Name='CMap&lt;*,*,*,*&gt;' IncludeView='keys'>
  <AlternativeType Name="CMapStringToString::CAssoc"/>
  <AlternativeType Name="CMapStringToPtr::CAssoc"/>
  <DisplayString>{{size = {m_nCount} }}</DisplayString>
  <Expand>
    <CustomListItems>
      <Variable Name='pHashtable' InitialValue='m_pHashTable'/>
      <Variable Name='hashtable_index' InitialValue='0'/>
      <Variable Name='pList' InitialValue='*m_pHashTable'/>
      <Variable Name='i' InitialValue='0'/>
      <Loop Condition='hashtable_index &lt; m_nHashTableSize'>
        <Exec>pList = pHashtable[hashtable_index]</Exec>
        <Loop Condition='pList '>
          <Item Name='[{i}].key:'>pList->key</Item>
          <Item Name='  [{i}].value:'>pList->value</Item>
          <Exec>pList = pList->pNext</Exec>
          <Exec>++i</Exec>
        </Loop>
        <Exec>++hashtable_index</Exec>
      </Loop>
    </CustomListItems>
  </Expand>
</Type>

Эти записи гарантируют, что объекты CMap хорошо отображаются, один под другим. Вместе с другой внутренней записью это дает следующий результат в окне просмотра Visual Studio:

0x000000005b9c95d0 Element L"Element1" (ID1/SubID1.1, L"interesting_information.1"/L"1.0.0.0")
0x0000000059484d20 Element L"Element2" (ID1/SubID1.2, L"interesting_information.2"/L"2.0.0.0")
0x000000004caa6110 Element L"Element3" (ID2/SubID2.1, L"interesting_information.3"/L"3.0.0.0")
...
(this goes until the end of the CMap)

Когда я пытаюсь сделать то же самое в Windbg (используя dx команды), это дает аналогичную информацию, но заканчивается в записи № 49:

Windbg Prompt>dx -r1 (*((<application>!CMap<unsigned __int64,unsigned __int64,CElement *,CElement *> *)0x13fbd2ae0))

["  [0].value:"] : 0x6dce7fd0 [Type: CElement *]
["[1].key:"]     : 0x7984000007a3 [Type: unsigned __int64]
["  [1].value:"] : 0x5b9c95d0 [Type: CElement *]
["[2].key:"]     : 0x79840000053f [Type: unsigned __int64]
...
["  [49].value:"] : 0x1bab05b0 [Type: CElement *]
[...]            [Type: CMap<unsigned __int64,unsigned __int64,CElement *,CElement *>]

(Нажав на записи, я получаю дополнительную информацию, которая корректно отображается в другой упомянутой записи родного визуализатора)

Я хотел бы знать причину, почему дисплей CMap Записи заканчиваются на 49. Я уже знаю, что могу получить больше записей, нажав на ... (который добавляет -c 100, -c 200... для dx команда), но если бы я мог получить больше информации (например, окно вывода Visual Studio с параметром "Отладка, Окно вывода, Общие параметры вывода, диагностические сообщения Natvis", установленным на "Подробно"), я бы смог диагностировать и решить мои проблемы

Кто-нибудь знает, как это сделать?
заранее спасибо

2 ответа

Решение

windbg может отлаживать windbg, ребенок windbg отлаживает ваш фактический двоичный файл

IIRC это Callef Дейзи Уилинг

откройте командную строку

наберите приложение windbg windbg и нажмите ввод

если вы не возражаете против использования консольной версии, в windbg есть встроенная команда

.dbgdbg

это породит родительский отладчик для существующего экземпляра

На данный момент для NatVis в WinDbg нет "расширенной диагностики", подобной той, которую вы можете получить с помощью Visual Studio.

Тем не менее, команда 'dx' по умолчанию отобразит первые 100 записей любого контейнера и отобразит ссылку DML для продолжения ([...]). Если вам нужно более 100 записей, вы можете использовать спецификатор формата, чтобы указать, сколько записей нужно отобразить (они такие же, как в Visual Studio).

Например:

dx <container expression>,1000

будет отображать 1000 записей того, что оценивалось до продолжения ссылки вместо 100 по умолчанию.

Другие вопросы по тегам