Под отладкой

Намедни решил заглянуть, сколько же отладочной информации в системе и насколько она может быть понятна человеку непосвященному. Но для начала немного теории.
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 года