Какова Ваша любимая подсказка/прием Windbg? [закрытый]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

45
задан user15071 19 July 2013 в 15:14
поделиться

11 ответов

Моим фаворитом является команда .cmdtree <file> (недокументированный, но ссылаемый в предыдущей информации о версии). Это может помочь в переводе в рабочее состояние другого окна (который может быть прикреплен) отобразить полезные или наиболее часто используемые команды. Это может помочь сделать пользователя намного более продуктивным использованием инструмента.

Первоначально говорил о здесь, с примером для <file> параметр: http://blogs.msdn.com/debuggingtoolbox/archive/2008/09/17/special-command-execute-commands-from-a-customized-user-interface-with-cmdtree.aspx

Пример: сопроводительный текст http://blogs.msdn.com/photos/debuggingtoolbox/images/8954736/original.aspx

30
ответ дан 3 revs, 2 users 80% 26 November 2019 в 20:55
поделиться

Сделайте не использование WinDbg .heap -stat команда. Это будет иногда давать Вам неправильный вывод. Вместо этого используйте создание отчетов памяти DebugDiags.

Наличие корректных чисел, можно тогда использовать WinDbg .heap -flt ... команда.

1
ответ дан 2 revs, 2 users 67% 26 November 2019 в 20:55
поделиться

Мне нравится использовать усовершенствованные команды точки останова, такие как использование точек останова для создания новых точек останова с одним выстрелом.

3
ответ дан Brian 26 November 2019 в 20:55
поделиться

"Подсказка", которую я использую чаще всего, является той, которая сохранит Вас от необходимости касаться той противной мыши так часто: Высокий звук + высокий звук 1

+ 1 поместит фокус в командное окно так, чтобы можно было на самом деле ввести команду и так, чтобы стрелка вниз на самом деле просмотрела историю команд путем прокрутки. Однако это не работает, если Ваш фокус уже находится в истории команд с возможностью прокрутки.

Обида: то, почему heck являются нажатиями клавиш, проигнорировало, в то время как фокус находится в исходном окне? Это не похоже на Вас, может отредактировать исходный код из WinDbg. Высокий звук + 1 к спасению.

10
ответ дан 2 revs, 2 users 77% 26 November 2019 в 20:55
поделиться

Почти 60% команд я каждый день использую..

dv /i /t
?? this
kM (kinda undocumented) generates links to frames
.frame x
!analyze -v
!lmi
~
15
ответ дан 3 revs, 3 users 60% 26 November 2019 в 20:55
поделиться

Следующая команда происходит очень удобная при наблюдении стека для объектов C++ с vtables, особенно при работе со сборками конечных версий, когда довольно много вещей оптимизированы далеко.

Диапазон dpp esp


Способность загрузить произвольный файл PE, поскольку дамп аккуратен:

windbg-z mylib.dll


Запрос GetLastError () с:

! gle


Это помогает декодировать коды распространенной ошибки:

! ошибка error_number
19
ответ дан 2 revs, 2 users 75% 26 November 2019 в 20:55
поделиться

Исследовать утечку памяти в дампе катастрофического отказа (так как я предпочитаю безусловно UMDH для живых процессов). Стратегия состоит в том, что объекты того же типа все выделяются с тем же размером.

  • Канал эти !heap -h 0 команда к версии командной строки WinDbg cdb.exe (для большей скорости) для получения всех выделений "кучи":
"C:\Program Files\Debugging Tools for Windows\cdb.exe" -c "!heap -h 0;q" -z [DumpPath] > DumpHeapEntries.log
  • Использование Cygwin к grep список выделений, группируя их размером:
grep "busy ([[:alnum:]]\+)" DumpHeapEntries.log \
| gawk '{ str = $8; gsub(/\(|\)/, "", str); print "0x" str " 0x" $4 }' \
| sort \
| uniq -c \
| gawk '{ printf "%10.2f %10d %10d ( %s = %d )\n", $1*strtonum($3)/1024, $1, strtonum($3), $2, strtonum($2) }' \
| sort > DumpHeapEntriesStats.log
  • Вы получаете таблицу, которая похожа на это, например, говоря нам что 25 529 270 выделений взятия на 0x24 байта почти 1.2  ГБ памяти.
   8489.52        707      12296 ( 0x3000 = 12288 )
  11894.28       5924       2056 ( 0x800 = 2048 )
  13222.66     846250         16 ( 0x2 = 2 )
  14120.41     602471         24 ( 0x2 = 2 )
  31539.30    2018515         16 ( 0x1 = 1 )
  38902.01    1659819         24 ( 0x1 = 1 )
  40856.38        817      51208 ( 0xc800 = 51200 )
1196684.53   25529270         48 ( 0x24 = 36 )
  • Затем, если Ваши объекты имеют vtables, просто используйте эти dps команда для поиска некоторых выделений "кучи" на 0x24 байта в DumpHeapEntries.log для знания типа объектов, которые берут всю память.
0:075> dps 3be7f7e8
3be7f7e8  00020006
3be7f7ec  090c01e7
3be7f7f0  0b40fe94 SomeDll!SomeType::`vftable'
3be7f7f4  00000000
3be7f7f8  00000000

Это является дрянным, но это работает :)

26
ответ дан 4 revs, 2 users 78% 26 November 2019 в 20:55
поделиться

Одно слово (ну ладно, три): DML , т.е. язык разметки отладчика .

Это довольно недавнее дополнение к WinDbg , и это не задокументировано в файле справки. Однако есть некоторая документация в "dml.doc" в каталоге установки для инструментов отладки для Windows.

По сути, это HTML-подобный синтаксис, который вы можете добавить в сценарии отладчика для форматирования и, что более важно, связывания. Вы можете использовать ссылки для вызова других сценариев или даже того же сценария.

Моя повседневная работа включает обслуживание мета-моделировщика, который обеспечивает общие объекты и отношения между объектами для большой части программного обеспечения C ++. Сначала, чтобы облегчить отладку, я написал простой сценарий дампа, который извлекает соответствующую информацию из этих объектов.

Теперь, с DML, я ' Мы могли добавлять ссылки к выходным данным, позволяя снова вызывать тот же сценарий для связанных объектов. Это позволяет гораздо быстрее исследовать модель.

Вот упрощенный пример. Предположим, что объект, подвергаемый интроспекции, имеет отношение, называемое «ссылкой» на другой объект. r @ $ t0 = $ arg1 $$ arg1 - это адрес объекта для изучения

$$ dump some information from $t0

$$ allow the user to examine our reference
aS /x myref @@(&((<C++ type of the reference>*)@$t0)->reference )
.block { .printf /D "<link cmd=\"$$>a< <full path to this script> ${myref}\">dump Ref</link> " }

Очевидно, это довольно шаблонный пример, но этот материал действительно бесценен для меня. Вместо того, чтобы искать нужные элементы данных в очень сложных объектах (что обычно занимало до минуты и различные уловки приведения типов и разыменования), все автоматизируется одним щелчком мыши!

8
ответ дан 26 November 2019 в 20:55
поделиться

В другом ответе упоминалась команда окна и Alt + 1 , чтобы сосредоточиться на окне ввода команд. Кому-нибудь сложно прокручивать окно вывода команд без использования мыши?

Что ж, недавно я использовал AutoHotkey для прокрутки окна вывода команд с помощью клавиатуры и не выходя из окна ввода команд.

; WM_VSCROLL = 0x115 (277)
ScrollUp(control="")
{
    SendMessage, 277, 0, 0, %control%, A
}

ScrollDown(control="")
{
    SendMessage, 277, 1, 0, %control%, A
}

ScrollPageUp(control="")
{
    SendMessage, 277, 2, 0, %control%, A
}

ScrollPageDown(control="")
{
    SendMessage, 277, 3, 0, %control%, A
}

ScrollToTop(control="")
{
    SendMessage, 277, 6, 0, %control%, A
}

ScrollToBottom(control="")
{   
    SendMessage, 277, 7, 0, %control%, A
}

#IfWinActive, ahk_class WinDbgFrameClass
    ; For WinDbg, when the child window is attached to the main window
    !UP::ScrollUp("RichEdit50W1")
    ^k::ScrollUp("RichEdit50W1")
    !DOWN::ScrollDown("RichEdit50W1")
    ^j::ScrollDown("RichEdit50W1")
    !PGDN::ScrollPageDown("RichEdit50W1")
    !PGUP::ScrollPageUp("RichEdit50W1")
    !HOME::ScrollToTop("RichEdit50W1")
    !END::ScrollToBottom("RichEdit50W1")
#IfWinActive, ahk_class WinBaseClass
    ; Also for WinDbg, when the child window is a separate window
    !UP::ScrollUp("RichEdit50W1")
    !DOWN::ScrollDown("RichEdit50W1")
    !PGDN::ScrollPageDown("RichEdit50W1")
    !PGUP::ScrollPageUp("RichEdit50W1")
    !HOME::ScrollToTop("RichEdit50W1")
    !END::ScrollToBottom("RichEdit50W1")

] После запуска этого скрипта вы можете использовать Alt + вверх / вниз для прокрутки одной строки окна вывода команд, Alt + PgDn / PgUp для прокрутки одного экрана.

Примечание.

4
ответ дан 26 November 2019 в 20:55
поделиться
  • .prefer_dml 1

    Это изменяет многие встроенные команды (например, lm ) для отображения вывода DML, который позволяет вам вместо этого нажимать ссылки запущенных команд. Довольно удобно ...

  • .reload / f / o file.dll ( / o перезапишет текущую копию имеющегося у вас символа)

  • .enable_unicode 1 // Переключает отладчик по умолчанию на Unicode для строк, поскольку все компоненты Windows внутренне используют Unicode, это очень удобно.

  • .ignore_missing_pages 1 // Если вы проведете много анализа дампа ядра, вы увидите много ошибок, связанных с выгружаемой памятью. Эта команда скажет отладчику прекратить выдачу этого предупреждения.

псевдоним псевдоним псевдоним ...

Сэкономьте время в отладчике. Вот некоторые из моих:

aS !p !process;
aS !t !thread;
aS .f .frame;
aS .p .process /p /r
aS .t .thread /p /r
aS dv dv /V /i /t //make dv do your favorite options by default
aS f !process 0 0 //f for find, e.g. f explorer.exe
7
ответ дан 26 November 2019 в 20:55
поделиться

Для командных и простых (статических или автоматических) подпрограмм, в которых используется отладчик, очень здорово иметь возможность помещать все команды отладчика для выполнения в текстовый командный файл и запускать его как ввод через kd.exe или cdb.exe, вызываемый с помощью пакетного сценария и т. д.

Запускайте его всякий раз, когда вам нужно выполнить ту же самую старую процедуру, без необходимости запускать WinDbg и делать что-то вручную. Жаль, что это не работает, если вы не уверены, что ищете, или если некоторые параметры команды требуют ручного анализа для поиска / получения.

1
ответ дан 26 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: