Намедни решил заглянуть, сколько же отладочной информации в системе и насколько она может быть понятна человеку непосвященному. Но для начала немного теории.
L4Ka::Pistachio имеет очень интересный макрос - L4_KDB_Enter. При внимательном рассмотрении можно обнаружить что он генерит следующий код (для наглядности перевожу этот макрос в fasm):
macro L4_KDB_Enter msg { local jump int3 jmp jump mov eax, msg jump: }
Т.е. когда процессор встречает в общем-то обычную инструкцию int3, то передает управление обработчику отладочного прерывания, который является частью микроядра Pistachio. В свою очередь, обработчик проверяет команды, идущие после инструкции прерывания и в случае, если они соответствуют вышеприведённому формату, выводит сообщение перед переходом во встроенный отладчик. Это позволяет идентифицировать что и в каком месте вызвало переход в отладчик.
Здесь следует отметить, что поставляемый вместе с Pistachio отладчик является самым низкоуровневым средством, которое предоставляет весьма скромные, но необходимые возможности для отладки - пошаговое исполнение, дамп памяти, дизассемблирование, показ регистров и т.д. К сожалению, этот консольный отладчик не предоставляет возможности StepOverFunctionCall, но эту возможность можно эмулировать, поставив точку останова. Другой особенностью встроенного в Pistachio отладчика является его режим работы с клавиатурой. Он не использует прерывания, а в цикле опрашивает порт клавиатуры. При этом загрузка процессора занимает 100%. Естественно, это не значит что Хамелеон работает по такому же принципу, Хамелеон честно использует прерывания.
Для человека, избалованного отладчиком TurboDebugger, а впоследствии плотно подсевшего на MS VisualStudio, такая отладка покажется адской пыткой. Впрочем, по сравнению со встроенным отладчиком Pistachio, даже GDB будет казаться верхом удобства и "юзер френдли". Надеюсь, теперь ты имеешь представление о встроенном отладчике микроядра Pistachio. Но что делать, в подавляющем большинстве случаев этот отладчик является единственным средством, дающим понять что происходит в каком либо программном потоке какого либо процесса.
Итак, не далее как 10 минут назад я набрал следующую команду:
grep -r -e L4_KDB_Enter * > dbg_msg.txt
и публикую здесь результат. Не суди строго за мой "руглиш":
display_driver/vga/VideoVGA.cc: L4_KDB_Enter("unable map video memory"); display_driver/ProtocolStartup.cc: L4_KDB_Enter("vty.drv: Error: Unable register console driver"); display_driver/ProtocolStartup.cc:// L4_KDB_Enter("Before wait"); display_driver/ProtocolStartup.cc:// L4_KDB_Enter("vty.drv: Error: No response from driver"); display_driver/ProtocolStartup.cc:// L4_KDB_Enter("vty.drv: Checkpoint"); display_driver/display/display.cc:// L4_KDB_Enter("Console sync error"); display_driver/display/display.cc: L4_KDB_Enter("Screen index error"); display_driver/main.cc: L4_KDB_Enter("Unable get keyboard service ID. Application will lock"); display_driver/main.cc: L4_KDB_Enter("vty.drv: Log reply IPC failed"); display_driver/main.cc: L4_KDB_Enter("vty.drv: Unknown command code"); display_driver/main.cc: L4_KDB_Enter("vty.drv: Logger reply IPC failed"); display_driver/Console.cc: L4_KDB_Enter("vty.drv: Close IPC failed"); display_driver/Console.cc: L4_KDB_Enter("vty.drv: Close IPC failed"); display_driver/Console.cc: L4_KDB_Enter("vty.drv: Closing non-opened console"); display_driver/Console.cc: L4_KDB_Enter("vty: Read confirmation failed"); display_driver/Console.cc: L4_KDB_Enter("vty.drv: Confirm write IPC failed"); display_driver/Console.cc: L4_KDB_Enter( "Unparsed ioctl"); display_driver/Console.cc: L4_KDB_Enter("vty.drv: Confirm IOCTL IPC failed"); ethernet_driver/ethernet_driver.cc: L4_KDB_Enter( "Ethernet registration IPC failed" ); ethernet_driver/ethernet_driver.cc: L4_KDB_Enter( "Got bad status of ethernet registration" ); ethernet_driver/ip_stack.cc: L4_KDB_Enter("IP packet lenght error"); filesystem_driver/RpcTalker.cc:// L4_KDB_Enter("Whoa"); filesystem_driver/BlockDeviceEnumerator.cc: L4_KDB_Enter("Read block"); filesystem_driver/executor/elf/Elf.cc:// L4_KDB_Enter("Check it!"); filesystem_driver/executor/elf/Elf.cc: //L4_KDB_Enter("?"); filesystem_driver/ProtocolStartup.cc: L4_KDB_Enter("Error"); filesystem_driver/Junction.cc: L4_KDB_Enter("CJunction: IPC failed" ); filesystem_driver/Junction.cc: L4_KDB_Enter("Asynchronus reponse sync error"); filesystem_driver/Junction.cc: L4_KDB_Enter("Asynchronous reponse sync error"); filesystem_driver/Junction.cc: L4_KDB_Enter("No free context"); filesystem_driver/Junction.cc: L4_KDB_Enter("CJunction: Input buffers exhausted"); filesystem_driver/Junction.cc: L4_KDB_Enter("CJunction: Context exhausted"); filesystem_driver/Junction.cc:// L4_KDB_Enter("Context switched, what next?"); filesystem_driver/Junction.cc: L4_KDB_Enter("Got unwanted response. May be algorithm error."); filesystem_driver/Junction.cc: L4_KDB_Enter( "Unable reply to upper layer requestor" ); filesystem_driver/Junction.cc:// L4_KDB_Enter("Before SP modification"); filesystem_driver/Junction.cc: L4_KDB_Enter("Junctions: Put buffers full"); filesystem_driver/Junction.cc: L4_KDB_Enter("Junction: PUT: Waiting error\n"); filesystem_driver/Junction.cc:// L4_KDB_Enter("Junction: GET: Waiting error\n"); filesystem_driver/Junction.cc:// L4_KDB_Enter("Memory initiialized"); filesystem_driver/Junction.cc:// L4_KDB_Enter("FileSystem initiialized"); filesystem_driver/Junction.cc:// L4_KDB_Enter("Crossroad initiialized"); filesystem_driver/FileSystemServer.cc: L4_KDB_Enter("Unable send filesystem log to device"); filesystem_driver/FileSystemServer.cc: L4_KDB_Enter("No log device attached"); filesystem_driver/FileSystemServer.cc: L4_KDB_Enter("handler IOCTL: Wtf?"); filesystem_driver/FileSystemServer.cc: L4_KDB_Enter("IOCTL: listen to message failed"); filesystem_driver/FileSystemServer.cc: L4_KDB_Enter("Sad news!!!"); filesystem_driver/FileSystemServer.cc: L4_KDB_Enter("FS Error"); filesystem_driver/FileSystemServer.cc:// L4_KDB_Enter("Filesystem started!!!!!"); filesystem_driver/source/FileSystem.cc: L4_KDB_Enter("/dev/tty: listen to message failed"); filesystem_driver/source/FileDescriptor.cc:# define L4_KDB_Enter(s) { puts(s); getc(stdin); } filesystem_driver/source/FileDescriptor.cc: L4_KDB_Enter("FileDescriptor_t found open file on Clear()"); filesystem_driver/source/FileDescriptor.cc: L4_KDB_Enter("Found inode without superblock"); filesystem_driver/source/MountList.cc:# define L4_KDB_Enter(x) filesystem_driver/source/MountList.cc: L4_KDB_Enter("Ttf!"); filesystem_driver/source/Inode.cc://L4_KDB_Enter("Before read block"); filesystem_driver/source/Inode.cc://L4_KDB_Enter("After read block"); filesystem_driver/source/Inode.cc:// L4_KDB_Enter("Single buffer allocated"); filesystem_driver/source/Inode.cc: L4_KDB_Enter("Single buffer error"); filesystem_driver/source/Inode.cc: L4_KDB_Enter("Double buffer error"); filesystem_driver/source/Inode.cc: L4_KDB_Enter("Triple buffer error"); filesystem_driver/source/dev_fs/DevSuperblock.cc: L4_KDB_Enter("DevSuperblock: IPC failed"); floppy_driver/floppy_driver.cc: L4_KDB_Enter("Puh"); floppy_driver/floppy_driver.cc: L4_KDB_Enter( "Floppy registration IPC failed" ); ide_driver/ide_server.cc: L4_KDB_Enter( "ATA/ATAPI registration IPC failed" ); init/init.cc:// L4_KDB_Enter("Constructor called"); init/init.cc:// L4_KDB_Enter("Destructor called"); init/init.cc: L4_KDB_Enter("Mount root failed"); init/init.cc: L4_KDB_Enter("Mount devfs failed"); init/init.cc:// L4_KDB_Enter("Ups!"); libc/xam_vsnprintf.cc:// L4_KDB_Enter( "Problem detected" ); libc/xam_signal.cc: L4_KDB_Enter("libc: Leave sigproxy signal terminated in send phase"); libc/xam_signal.cc: L4_KDB_Enter("libc: __sig_leave: YOU MUST NEVER REACH THIS POINT"); libc/xam_signal.cc: L4_KDB_Enter("sigprocmask() called"); libc/xam_string.cc: L4_KDB_Enter("Will fall"); libc/xam_string.cc: L4_KDB_Enter("Check me"); libc/xam_stub.cc: L4_KDB_Enter("Attempt to use a virtual function before object has been constructed\n"); libc/xam_unistd.cc: L4_KDB_Enter("sys_exit: Unable terminate process"); libc/call/xam_fs_call.cc: L4_KDB_Enter("FileSystem called prior initialization"); libc/call/xam_fs_call.cc: L4_KDB_Enter("Interrupted fs call"); libc/stdio/xam_stdio.cc: L4_KDB_Enter("fopen 'a' mode detected"); libc/stdio/xam_vsscanf.cc: L4_KDB_Enter("vsscanf called"); libc/unistd/xam_seek.cc:// L4_KDB_Enter("lseek completed"); libc/xam_console.cc: L4_KDB_Enter("Cannot found console driver"); libc/xam_console.cc: L4_KDB_Enter("Fix console status"); libc/xam_console.cc: L4_KDB_Enter("xam_gethar() IPC fault"); libc/xam_console.cc: L4_KDB_Enter("Console device locked?"); libc/xam_console.cc: L4_KDB_Enter("xam_printf(): Console did not initialized yet"); libc/xam_console.cc: L4_KDB_Enter("xam open interrupted"); libcc/CriticalSection.cc: L4_KDB_Enter("Destroing a not released critical section"); libcc/CriticalSection.cc: L4_KDB_Enter("Stop process by critical section"); libcc/CriticalSection.cc: L4_KDB_Enter("Continue process by critical section"); libcc/Memory.cc:// L4_KDB_Enter("Check msg"); libcc/LineDiscipline.cc: if( nInputBytesCount < nBytesRead ) L4_KDB_Enter("Line discipline problem"); libcc/LineDiscipline.cc: L4_KDB_Enter("Something strange around here"); libcc/LineDiscipline.cc: L4_KDB_Enter("Got VKILL character"); libcc/LineDiscipline.cc:// L4_KDB_Enter("vty:LineDisciplineSendData"); libcc/DeviceDriver.cc: L4_KDB_Enter("Cannot found init process"); ramdisk_driver/ramdisk_driver.cc: L4_KDB_Enter( "RAMDISK registration IPC failed" ); roottask/xam_pager.cc: L4_KDB_Enter("Console device locked?"); roottask/xam_pager.cc: L4_KDB_Enter("PAGER IPC failed "); roottask/xam_pager.cc: L4_KDB_Enter("Unrecoverable Page fault"); roottask/xam_pager.cc: L4_KDB_Enter("MAP IPC failed"); roottask/xam_pager.cc: L4_KDB_Enter("Wow!"); roottask/xam_pager.cc: L4_KDB_Enter("Startup IPC failed"); roottask/TaskManager/process.cc: L4_KDB_Enter("Address space creation error"); roottask/TaskManager/process.cc: L4_KDB_Enter("Space control error"); roottask/TaskManager/process.cc:// L4_KDB_Enter("Check KIP, please"); roottask/TaskManager/process.cc: L4_KDB_Enter("Activate thread error"); roottask/TaskManager/process.cc: L4_KDB_Enter("Allocate_Thread: Too many threads"); roottask/TaskManager/process.cc: L4_KDB_Enter("Allocate_Thread: Local thread map full"); roottask/TaskManager/process.cc:// L4_KDB_Enter("Write page"); roottask/TaskManager/process.cc: L4_KDB_Enter( "Unable set BSS segment due to synchronozation error" ); roottask/TaskManager/process.cc: L4_KDB_Enter( "Unable set owner to BSS segment" ); roottask/TaskManager/process.cc: L4_KDB_Enter("Delivery signal"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Release tid: TID was not allocated"); roottask/TaskManager/task_manager.cc:// L4_KDB_Enter("Allocate thread"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Release tid: TID was not allocated"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Allocate_Thread: Unable get PLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Allocate_Thread: unable allocate TID"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Allocate_Thread: Unable allocate TID"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Thread_Create: Unable get TLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Thread_Create: Unable get PLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Thread_Create: Unable allocate TID"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Thread start"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Thread_Destroy: Unable get TLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Thread_Destroy: Unable get PLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Unable allocate Thread ID\n"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Unable allocate process local strorage\n"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Unable allocate UTCB\n"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Unable allocate thread local strorage\n"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("AllocateProcess() cannot create an address space\n"); roottask/TaskManager/task_manager.cc:// L4_KDB_Enter("Checkpoint"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Supervisor: Process_Exec: Unable get TLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Supervisor: Process_Exec: Unable get PLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Process_Exec: Unable allocate process local strorage\n"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Process_Exec: Unable allocate UTCB\n"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Process_Fork: Unable get TLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Process_Fork: Unable get PLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Process_Destroy: Unable get TLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Process_Destroy: Unable get PLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Process_Wait: Unable get parent PLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter("Process_Wait: Unable get parent TLS"); roottask/TaskManager/task_manager.cc: L4_KDB_Enter( "Fault instruction pointer" ); roottask/TaskManager/thread.cc:// L4_KDB_Enter("PREPARE STACK"); roottask/TaskManager/thread.cc:// L4_KDB_Enter("PutReturnAddressOnStack"); roottask/MemoryManager/object_stream.cc: L4_KDB_Enter("Release did not implemented yet"); roottask/MemoryManager/object_stream.cc:// L4_KDB_Enter("Woo a la"); roottask/MemoryManager/MemoryManager.cc:// L4_KDB_Enter("Requesting first page"); roottask/MemoryManager/MemoryManager.cc: L4_KDB_Enter("Release of a that size complex page is not implemented"); roottask/MemoryManager/MemoryManager.cc: L4_KDB_Enter("Physical pages that size complex page is not implemented"); roottask/MemoryManager/MemoryManager.cc: L4_KDB_Enter("Use step for debug"); roottask/MemoryManager/MemoryManager.cc: L4_KDB_Enter("sigma0 failed"); roottask/MemoryManager/segment.cc:// L4_KDB_Enter("Page size not match"); roottask/MemoryManager/segment.cc: L4_KDB_Enter(); roottask/MemoryManager/segment.cc: L4_KDB_Enter("Broken segment's allocation type"); roottask/MemoryManager/segment.cc: L4_KDB_Enter("Somebody release direct segment"); roottask/MemoryManager/segment.cc: //L4_KDB_Enter("Do we need modify refence counter on parent object?"); roottask/MemoryManager/segment.cc: L4_KDB_Enter("Does anybody could imagine where a pointer map useful?"); roottask/MemoryManager/segment.cc:// L4_KDB_Enter("checkpoint"); roottask/MemoryManager/segment.cc: L4_KDB_Enter("Import pages"); roottask/MemoryManager/segment.cc: L4_KDB_Enter("Unaligend address on MemorySegment::Get_Word"); roottask/MemoryManager/page_stream.cc:// L4_KDB_Enter("Requesting page of pages"); roottask/MemoryManager/page_stream.cc: L4_KDB_Enter("Unable allocate page of pages"); roottask/MemoryManager/page_stream.cc: L4_KDB_Enter("Unable allocate page of pages"); roottask/MemoryManager/CompoundSegment.cc: L4_KDB_Enter("Unable map pysical pages"); roottask/MemoryManager/CompoundSegment.cc: L4_KDB_Enter( "Compound segment synchronization error" ); roottask/MemoryManager/CompoundSegment.cc:// L4_KDB_Enter("Got compound page"); roottask/roottask.cc:// L4_KDB_Enter("Unable start the init process. Press g to continue"); roottask/roottask.cc: L4_KDB_Enter("Unable start pager"); roottask/roottask.cc: L4_KDB_Enter("Unable start timer"); roottask/roottask.cc: L4_KDB_Enter("Unable start Hardware abstraction layer"); roottask/roottask.cc: L4_KDB_Enter("Unable start control thread"); roottask/roottask.cc: L4_KDB_Enter("Server terminated"); roottask/xam_dbgconsole.cc: L4_KDB_Enter("Superisor:Unable initialize console"); roottask/xam_dbgconsole.cc: L4_KDB_Enter("Superisor:Unable open debug console"); roottask/xam_dbgconsole.cc: L4_KDB_Enter("Superisor:Unable open debug console"); roottask/xam_dbgconsole.cc: L4_KDB_Enter("--- enter kernel debugger"); roottask/xam_modules.cc: L4_KDB_Enter("unable to map multi-boot-info"); roottask/xam_modules.cc: L4_KDB_Enter("unable to map multi-boot-info"); roottask/xam_modules.cc:// L4_KDB_Enter("Before run modile"); roottask/xam_modules.cc: L4_KDB_Enter( "Press g to continue" ); roottask/xam_modules.cc: L4_KDB_Enter( "Press g to continue" ); roottask/xam_modules.cc: L4_KDB_Enter("Module execution completed"); roottask/xam_modules.cc: L4_KDB_Enter( "Unable allocate module pages" ); roottask/xam_timer.cc:// L4_KDB_Enter("Timer service message"); roottask/xam_timer.cc: L4_KDB_Enter("Timer IPC failed "); roottask/xam_dispatcher.cc: L4_KDB_Enter("System exception catched"); roottask/xam_dispatcher.cc: L4_KDB_Enter("Program exception catched"); roottask/xam_dispatcher.cc: L4_KDB_Enter("ProcessCreate syscall removed from specification"); roottask/xam_dispatcher.cc:// L4_KDB_Enter("SUPERVISOR: before process destroy\n"); roottask/xam_dispatcher.cc:// L4_KDB_Enter("SUPERVISOR: Within process destroy\n"); roottask/xam_dispatcher.cc:// L4_KDB_Enter("SUPERVISOR: Message sent to an event listener\n"); roottask/xam_dispatcher.cc: L4_KDB_Enter("Change heap size"); roottask/xam_dispatcher.cc: L4_KDB_Enter("Puh"); roottask/drivers/xam_blkdevice.cc: L4_KDB_Enter("Bad format detected"); roottask/drivers/i8042.cc:// if( ch == 1 ) L4_KDB_Enter("Inside keyboard handler"); roottask/drivers/i8042.cc: L4_KDB_Enter("console driver busy?!"); roottask/drivers/i8042.cc:// L4_KDB_Enter("Nobody lisen for interrupt"); rs232/rs232.cc: L4_KDB_Enter("RS232: Unknown IOCTL code"); rs232/rs232.cc: L4_KDB_Enter("RS232: Confirmation IPC failed"); rs232/rs232.cc: L4_KDB_Enter("RS232: Confirm write IPC failed"); rs232/rs232.cc:// L4_KDB_Enter("Checkpoint"); rs232/rs232.cc: L4_KDB_Enter("Serial device %d does not exist"); rs232/rs232.cc: L4_KDB_Enter("rs232.drv: Logger reply IPC failed"); rs232/rs232.cc: L4_KDB_Enter("RS232: Unknown request"); rs232/rs232.cc: L4_KDB_Enter("rs232.drv: IPC failed"); rs232/rs232.cc:// L4_KDB_Enter("Attempt to use a virtual function before object has been constructed\n"); rs232/rs232.cc: L4_KDB_Enter( "RS232 registration IPC failed" );
Алексей Мандрыкин
5 ноября 2007 года