Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Моим фаворитом является команда .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
Сделайте не использование WinDbg .heap -stat
команда. Это будет иногда давать Вам неправильный вывод. Вместо этого используйте создание отчетов памяти DebugDiags.
Наличие корректных чисел, можно тогда использовать WinDbg .heap -flt ...
команда.
Мне нравится использовать усовершенствованные команды точки останова, такие как использование точек останова для создания новых точек останова с одним выстрелом.
"Подсказка", которую я использую чаще всего, является той, которая сохранит Вас от необходимости касаться той противной мыши так часто: Высокий звук + высокий звук 1
+ 1 поместит фокус в командное окно так, чтобы можно было на самом деле ввести команду и так, чтобы стрелка вниз на самом деле просмотрела историю команд путем прокрутки. Однако это не работает, если Ваш фокус уже находится в истории команд с возможностью прокрутки.
Обида: то, почему heck являются нажатиями клавиш, проигнорировало, в то время как фокус находится в исходном окне? Это не похоже на Вас, может отредактировать исходный код из WinDbg. Высокий звук + 1 к спасению.
Почти 60% команд я каждый день использую..
dv /i /t
?? this
kM (kinda undocumented) generates links to frames
.frame x
!analyze -v
!lmi
~
Следующая команда происходит очень удобная при наблюдении стека для объектов C++ с vtables, особенно при работе со сборками конечных версий, когда довольно много вещей оптимизированы далеко.
Диапазон dpp esp
Способность загрузить произвольный файл PE, поскольку дамп аккуратен:
windbg-z mylib.dll
Запрос GetLastError () с:
! gle
Это помогает декодировать коды распространенной ошибки:
! ошибка error_number
Исследовать утечку памяти в дампе катастрофического отказа (так как я предпочитаю безусловно 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
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
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 )
dps
команда для поиска некоторых выделений "кучи" на 0x24 байта в DumpHeapEntries.log для знания типа объектов, которые берут всю память. 0:075> dps 3be7f7e8 3be7f7e8 00020006 3be7f7ec 090c01e7 3be7f7f0 0b40fe94 SomeDll!SomeType::`vftable' 3be7f7f4 00000000 3be7f7f8 00000000
Это является дрянным, но это работает :)
Одно слово (ну ладно, три): 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> " }
Очевидно, это довольно шаблонный пример, но этот материал действительно бесценен для меня. Вместо того, чтобы искать нужные элементы данных в очень сложных объектах (что обычно занимало до минуты и различные уловки приведения типов и разыменования), все автоматизируется одним щелчком мыши!
В другом ответе упоминалась команда окна и 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 для прокрутки одного экрана.
Примечание.
.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
Для командных и простых (статических или автоматических) подпрограмм, в которых используется отладчик, очень здорово иметь возможность помещать все команды отладчика для выполнения в текстовый командный файл и запускать его как ввод через kd.exe или cdb.exe, вызываемый с помощью пакетного сценария и т. д.
Запускайте его всякий раз, когда вам нужно выполнить ту же самую старую процедуру, без необходимости запускать WinDbg и делать что-то вручную. Жаль, что это не работает, если вы не уверены, что ищете, или если некоторые параметры команды требуют ручного анализа для поиска / получения.