Kdbg
Эта страница ранее являлась зеркалом страницы KDBG (rev 72) на Blight's Wiki.
Введение
KDB - это отладчик ядра (Kernel DeBugger) ReactOS, он встроен в ntoskrnl. KBD позволяет обработать дважды каждое исключение, получаемое ядром. Один раз до того, как ядро попытается обнаружить и выполнить обработчик исключений, а другой раз после этого, если обработчик не будет обнаружен или имеющийся обработчик не поддерживает данный тип исключений. Когда KDB вызывается до обработчика исключений, это называется первый шанс, а когда после - последний шанс.
Для каждого типа исключений, известных KDB, вы можете задать условие, по которому будет произведён переход в отладчик, в отдельности для первого и последнего шанса. Возможными вариантами условия являются never, umode, kmode и always. never означает, что при возникновении исключения переход в KDB производиться не будет, umode означает, что переход в KDB будет происходить при возникновении исключения в пользовательском режиме, kmode означает, что переход в KDB будет происходить при возникновении исключения в режиме ядра, и always означает переход в KDB в любом случае.
Включение KDBG перед сборкой
KDBG автоматически включается и отключается скриптом параметров конфигурирования (cmake/config.cmake).
KDBG по умолчанию настроен на включение при выборе в загрузчике ОС пунктов "ReactOS (Debug)" и "ReactOS (RosDbg)" во всех образах ISO. Смотрите также Отладка#Останов с переходом во встроенный отладчик ядра.
KDBinit
KDB настолько быстро, насколько это возможно, загрузит и обработает файл KDBinit (\SystemRoot\system32\drivers\etc\KDBinit)
Файл KDBinit может содержать все команды, доступные в консольном интерфейсе KDB плюс команда break. При обнаружении команды break в файле KDBinit присходит переход в KDB - вы можете использовать это для автоматического перехода в KDB при начальной загрузке.
Здесь приведён стандартный файл KDBinit (команда break закомментирована):
# Образец файла KDBinit # # Переключаем режим дизассемблирования на "intel" (по умолчанию "at&t") set syntax intel # Изменение условия входа в KDB по INT3 на "always" (по умолчанию "kmode") #set condition INT3 first always # Это специальная команда, доступная только в файле KDBinit - происходит переход в # KDB при обработке файла init во время начальной загрузки. #break
Справочник по командам
?
Синтаксис: ? выражение
Оценка выражения. Результат отображается в шестнадцатиричном и беззнаковом десятичном форматах. Если значение < 0, то результат выводится также в десятичном формате со знаком.
kdb:> ? eip 0xc00a1535 3221886261 -1073081035
Поддерживаются следующие операнды: +,-,*,/,%,==,!=,>,<,>=,<=
Фигурные скобки поддерживаются.
Квадратные скобки могут использоваться для ссылки на память. Размер памяти (byte, word, dword или qword) может быть указан как префикс перед открывающей скобкой. По умолчанию он равен размеру указателя (dword для IA32)
kdb:> ? 1+2*3 0x00000007 7 kdb:> ? (1+2)*3 0x00000009 9 kdb:> ? [eip] 0xffbe16e8 4290647784 -4319512 kdb:> ? word[eip] 0x000016e8 5864 kdb:> ? byte[eip] 0x000000e8 232 -24 kdb:> ? byte[eip+1] 0x00000016 22 kdb:> ? [0] ^ Couldn't access memory at 0x0
bc
Синтаксис: bc [точка останова]
Очистка точки останова.
bd
Синтаксис: bd [точка останова]
Отключение точки останова.
be
Синтаксис: be [точка останова]
Включение точки останова.
bl
Синтаксис: bl
Список точек останова.
bpm
Синтаксис: bpm [r|w|rw|x] [byte|word|dword] [адрес]
Установка точки останова на указанный адрес памяти.
bpx
Синтаксис: bpx [адрес]
Установка программной точки останова на указанный адрес.
Примечание: на забывайте вводить 'set condition INT3 first always' при установке точки останова в пользовательском режиме, иначе переход в KDB производиться не будет.
bt
Синтаксис: bt [*опорный адрес]
Вывод текущей обратной трассировки или обратной трассировки с указанного опорного адреса
kdb:> bt Frames: <ntoskrnl.exe:d9dc> <c00a248f> <ntoskrnl.exe:1140>
bugcheck
Синтаксис: bugcheck
Критический сбой системы.
cont
Синтаксис: cont
Продолжение выполнения (покинуть отладчик)
cregs
Синтаксис: cregs
Отображение регистров управления.
kdb:> cregs CR0 0x8001003b PE MP TS ET NE WP PG CR2 0xccc91000 CR3 0x002f9000 Pagedir-Base 0x002f9000 CR4 0x00000680 PGE OSFXSR OSXMMEXCPT GDTR Base 0xc00bb100 Size 0x0058 LDTR Base 0x00000000 Size 0x0000 IDTR Base 0xc0122ac0 Size 0x0800
disasm
Синтаксис: disasm [адрес] [L количество]
Дизассемблирование указанного количества инструкций с заданного адреса.
kdb:> disasm <c00a1535>: call <0xC009D350> <c00a153a>: call <0xC009D110> <c00a153f>: call <ntoskrnl.exe:2e990> <c00a1544>: call <0xC009DDD0> <c00a1549>: mov 0xc0104d40,%eax <c00a154e>: cmpb $0x0,(%eax) <c00a1551>: je <0xC00A1597> <c00a1553>: lea 0x0(%esi),%esi <c00a1559>: lea 0x0(%edi,1),%edi <c00a1560>: sub $0x8,%esp
Синтаксис Intel также поддерживается:
kdb:> set syntax intel kdb:> disasm <c00a1535>: call <0xC009D350> <c00a153a>: call <0xC009D110> <c00a153f>: call <ntoskrnl.exe:2e990> <c00a1544>: call <0xC009DDD0> <c00a1549>: mov eax,ds:0xc0104d40 <c00a154e>: cmp BYTE PTR [eax],0x0 <c00a1551>: je <0xC00A1597> <c00a1553>: lea esi,[esi] <c00a1559>: lea edi,[edi*1] <c00a1560>: sub esp,0x8
dmesg
Синтаксис: dmesg
Вывод отладочных сообщений на экран (выводится также и состояние страниц).
dregs
Синтаксис: dregs
Отображение регистров отладки.
kdb:> dregs DR0 0x00000000 DR1 0x00000000 DR2 0x00000000 DR3 0x00000000 DR6 0xffff0ff0 DR7 0x00000400
dt
Синтаксис: dt [модуль] [тип] [адрес]
Вывод структуры.
filter
Синтаксис: filter [error|warning|trace|info|level]+|-[названиекомпонента|поумолчанию]
Включить/отключить каналы отладки.
Пример:
kdb:> filter trace+i8042prt
Пример:
kdb:> filter +serial
gdt
Синтаксис: gdt
Отображение глобальной таблицы дескрипторов.
kdb:> gdt GDT Base: 0x800d2100 Limit: 0x0058 Idx Sel. Type Base Limit DPL Attribs 001 0x0008 CODE32 0x00000000 0x0fffffff 00 R/X 002 0x0010 DATA32 0x00000000 0x0fffffff 00 R/W 003 0x001b CODE32 0x00000000 0x0fffffff 03 R/X 004 0x0023 DATA32 0x00000000 0x0fffffff 03 R/W 005 0x0028 TSS32(Busy) 0x8012d9f0 0x00002069 00 006 0x0030 DATA16 0xff000000 0x00001000 00 R/W 007 0x003b DATA16 0x00000000 0x00001000 03 R/W 008 0x0040 UNKNOWN [NP] [NP] 00 NP 009 0x0048 LDT 0x00000000 0x00000001 00 010 0x0050 TSS32(Avl) 0x80115960 0x00000069 00
help
Синтаксис: help
Вывод на экран справки по командам отладчика.
kdb:> help Kernel debugger commands: * Data: ? expression - Evaluate expression. disasm [address] [L count] - Disassemble count instructions at address. x [address] [L count] - Display count dwords, starting at addr. regs - Display general purpose registers. cregs - Display control registers. sregs - Display status registers. dregs - Display debug registers. bt [*frameaddr|thread id] - Prints current backtrace or from given frame addr * Flow control: cont - Continue execution (leave debugger) step [count] - Execute single instructions, stepping into interrupts. next [count] - Execute single instructions, skipping calls and reps. bl - List breakpoints. be [breakpoint] - Enable breakpoint. bd [breakpoint] - Disable breakpoint. bc [breakpoint] - Clear breakpoint. bpx [address] [IF condition] - Set software execution breakpoint at address. bpm [r|w|rw|x] [byte|word|dword] [address] [IF condition] - Set memory breakpoint at address. * Process/Thread: thread [list[ pid]|[attach ]tid] - List threads in current or specified process, display thread with given id or attach to thread. proc [list|[attach ]pid] - List processes, display process with given id or attach to process. * System info: mod [address] - List all modules or the one containing address. gdt - Display global descriptor table. ldt - Display local descriptor table. idt - Display interrupt descriptor table. pcr - Display processor control region. tss - Display task state segment. * Others: bugcheck - Bugchecks the system. set [var] [value] - Sets var to value or displays value of var. help - Display help screen.
idt
Синтаксис: idt
Отображение таблицы векторов прерываний.
kdb:> idt IDT Base: 0x8012d1d0 Limit: 0x0800 Idx Type Seg. Sel. Offset DPL 000 TRAPGATE32 0x0008 0x800039bf 00 001 TRAPGATE32 0x0008 0x800039ce 00 002 TRAPGATE32 0x0008 0x800039dd 00 003 TRAPGATE32 0x0008 0x800039ec 03 004 TRAPGATE32 0x0008 0x800039fb 00 005 TRAPGATE32 0x0008 0x80003a0a 00 006 TRAPGATE32 0x0008 0x80003a19 00 007 TRAPGATE32 0x0008 0x80003a28 00 008 TASKGATE 0x0050 00 009 TRAPGATE32 0x0008 0x80003a3d 00 010 TRAPGATE32 0x0008 0x80003a4c 00 011 TRAPGATE32 0x0008 0x80003a59 00 012 TRAPGATE32 0x0008 0x80003a66 00 013 TRAPGATE32 0x0008 0x80003a73 00 014 INTGATE32 0x0008 0x80003a80 00 015 TRAPGATE32 0x0008 0x80003a8d 00 016 TRAPGATE32 0x0008 0x80003a9c 00 017 TRAPGATE32 0x0008 0x80003aab 00 018 TRAPGATE32 0x0008 0x80003aba 00 019 TRAPGATE32 0x0008 0x80003ac9 00 020 TRAPGATE32 0x0008 0x80003ad8 00 ... 044 TRAPGATE32 0x0008 0x80003ad8 00 045 TRAPGATE32 0x0008 0x8006ef9f 03 046 TRAPGATE32 0x0008 0x80003b79 03 047 TRAPGATE32 0x0008 0x80003ad8 00 ...
kmsg
Синтаксис: kmsg
То же самое, что и dmesg.
ldt
Синтаксис: ldt
Отображение локальной таблицы дескрипторов.
kdb:> ldt Local descriptor table is empty.
mod
Синтаксис: mod [адрес]
Список всех модулей или отображение модуля по его адресу.
kdb:> mod Base Size Name c0000000 00096ca0 ntoskrnl.exe c039c000 00007de0 hal.dll
next
Синтаксис: next [число]
Пошаговое выполнение инструкций с пропуском вызовов.
pcr
Синтаксис: pcr
Отображение области контроля процессора.
kdb:> pcr Current PCR is at 0xff000000. Tib.ExceptionList: 0xffffffff Tib.StackBase: 0x00000000 Tib.StackLimit: 0x00000000 Tib.SubSystemTib: 0x00000000 Tib.FiberData/Version: 0x00000000 Tib.ArbitraryUserPointer: 0x00000000 Tib.Self: 0xff000000 Self: 0xff000000 PCRCB: 0xff000120 Irql: 0x00 IRR: 0x00000000 IrrActive: 0x00000000 IDR: 0x00000000 KdVersionBlock: 0x00000000 IDT: 0x8012d1d0 GDT: 0x800d2100 TSS: 0x8012d9f0 MajorVersion: 0x0000 MinorVersion: 0x0000 SetMember: 0x00000000 StallScaleFactor: 0x00000000 DebugActive: 0x00 ProcessorNumber: 0x00 L2CacheAssociativity: 0x00 VdmAlert: 0x00000000 L2CacheSize: 0x00000000 InterruptMode: 0x00000000
proc
Синтаксис: proc [list|[attach ]pid]
Вывод списка процессов, отображение процесса по указанному id или присоединение к процессу.
kdb:> proc Current process: PID: 0x00000004 State: Unknown (0x0) Image Filename: System kdb:> proc list PID State Filename *0x00000004 Unknown System 0x00000058 Active smss.exe 0x0000007c Active csrss.exe 0x00000094 Active winlogon.exe 0x000000b0 Active setup.exe
regs
Синтаксис: regs
Отображение состояния регистров общего назначения.
kdb:> regs CS:EIP 0x0008:0xc00b880a SS:ESP 0xd754:0x00000000 EAX 0x01c634d3 EBX 0x0000940e ECX 0x00000000 EDX 0x00000000 ESI 0x002ff000 EDI 0x00000000 EBP 0xc0103c70 EFLAGS 0x00200202 IF IOPL0 ID
set
Синтаксис: set [переменная] [значение]
Установка или отображение значения переменной.
kdb:> set Available settings: syntax [intel|at&t] condition [exception|*] [first|last] [never|always|kmode|umode] kdb:> set syntax syntax = at&t kdb:> set condition Conditions: (First) (Last) #00 ZERODEVIDE never kmode #01 DEBUGTRAP always never #02 NMI never always #03 INT3 kmode never #04 OVERFLOW never kmode #05 BOUND never kmode #06 INVALIDOP never kmode #07 NOMATHCOP never kmode #08 DOUBLEFAULT always always #09 RESERVED(9) always always #10 INVALIDTSS never kmode #11 SEGMENTNOTPRESENT never kmode #12 STACKFAULT never kmode #13 GPF never kmode #14 PAGEFAULT never kmode #15 RESERVED(15) always always #16 MATHFAULT never kmode #17 ALIGNMENTCHECK never kmode #18 MACHINECHECK never kmode #19 SIMDFAULT never kmode OTHERS never kmode
Пример: Включение програмных точек останова пользовательского режима.
kdb:> set condition int3 first always kdb:> set condition int3 Condition for exception #03 (INT3): FirstChance always LastChance never
Пример: Срабатывание на все исключения.
kdb:> set condition * first always
sregs
Синтаксис: sregs
Отображение регистров сегмента/селектора.
kdb:> sregs CS 0x0008 Index 0x0001 GDT RPL0 DS 0x0010 Index 0x0002 GDT RPL0 ES 0x0010 Index 0x0002 GDT RPL0 FS 0x0030 Index 0x0006 GDT RPL0 GS 0x0010 Index 0x0002 GDT RPL0 SS 0xd754 Index 0x1aea LDT RPL0
step
Синтаксис: step [count]
Пошаговое выполнение инструкций, со входом в прерывания (т.е. если EIP указывает на int 0x2e, то KDB получает адрес обработчика прерываний, устанавливает в нём INT3 и продолжает выполнение)
thread
Синтаксис: thread [list[ pid]|[attach ]tid]
Создание списка потоков в текущем или указанном процессе, отображение потока с указанным id или подключение к потоку.
kdb:> thread Current Thread: TID: 0x00000000 State: Running (0x2) Priority: 8 Affinity: 0x00000001 Initial Stack: 0x8011f5a0 Stack Limit: 0x8011c5a0 Stack Base: 0x8011f5a0 Kernel Stack: 0x8011f5a0 Trap Frame: 0x00000000 NPX State: Invalid (0x1) kdb:> thread list TID State Prior. Affinity EBP EIP *0x00000000 Running 8 0x00000001 0x00000000 0x00000000 0x00000008 Blocked 16 0xffffffff 0x9cdcbd38 0x8001009e 0x0000000c Blocked 16 0xffffffff 0x9cdced38 0x8001009e 0x00000010 Blocked 16 0xffffffff 0x9cdd1d38 0x8001009e 0x00000014 Blocked 16 0xffffffff 0x9cdd4d38 0x8001009e 0x00000018 Blocked 16 0xffffffff 0x9cdd7d38 0x8001009e 0x0000001c Ready 0 0xffffffff 0x00000000 0x00000000 0x00000020 Ready 0 0xffffffff 0x00000000 0x00000000 0x00000024 Ready 0 0xffffffff 0x00000000 0x00000000 0x00000028 Ready 0 0xffffffff 0x00000000 0x00000000 0x0000002c Ready 0 0xffffffff 0x00000000 0x00000000 0x00000030 Blocked 31 0xffffffff 0x9cde9d38 0x8001009e 0x00000034 Blocked 31 0xffffffff 0x9cdecd38 0x8001009e 0x00000038 Blocked 31 0xffffffff 0x9cdefd38 0x8001009e 0x0000003c Blocked 31 0xffffffff 0x9cdf2d38 0x8001009e 0x00000040 Blocked 31 0xffffffff 0x9cdf5d38 0x8001009e 0x00000044 Blocked 8 0xffffffff 0x9cdf8d28 0x8001009e 0x00000048 Ready 0 0xffffffff 0x00000000 0x00000000 0x0000004c Blocked 17 0xffffffff 0x9cdfed08 0x8001009e 0x00000050 Ready 1 0xffffffff 0x00000000 0x00000000 0x00000054 Blocked 16 0xffffffff 0x9ce04d28 0x8001009e
tss
Синтаксис: tss
Отображение сегмента состояния задачи.
kdb:> tss Current TSS is at 0x8012d9f0. PreviousTask: 0x00000000 Ss0:Esp0: 0x0010:0x80137df0 Ss1:Esp1: 0x0000:0x00000000 Ss2:Esp2: 0x0000:0x00000000 Cr3: 0x00000000 Eip: 0x00000000 Eflags: 0x00000000 Eax: 0x00000000 Ecx: 0x00000000 Edx: 0x00000000 Ebx: 0x00000000 Esp: 0x00000000 Ebp: 0x00000000 Esi: 0x00000000 Edi: 0x00000000 Es: 0x0000 Cs: 0x0000 Ss: 0x0000 Ds: 0x0000 Fs: 0x0000 Gs: 0x0000 Ldt: 0x0048 Trap: 0x0000 IoMapBase: 0xffff
x
Синтаксис: x [адрес] [L количество]
Переключение режима отображения на DWORD (4 байта), начиная с указанного адреса.
kdb:> x ebp <c0103c70>: c0103c80 c000fbec 00000000 012ff000 <c0103c80>: c0103de0 c00b91e6 00000001 c011bc90 <c0103c90>: 00000014 c0103dc4 00000000 00000000 <c0103ca0>: 00000000 c03c6000 c0397000 c0125000