Debugging Metalkit Apps
이 글은 리눅스의 gdb로 Metalkit을 동적으로 분석할 수 있는 방법을 설명하며,
본 게시글은 vmware에서 제공하는 vmware-svga의 내용을 나름대로 해석한 글이다.
디버깅하고자 하는 vm 이미지의 설정파일(*.vmx)를 에디터로 오픈해서 아래의 내용을 한다.
debugStub.listen.guest32 = "TRUE"
debugStub.hideBreakpoints = "TRUE"
monitor.debugOnStartGuest32 = "TRUE"
이 후, VM 이미지를 실행하면 bios 화면이 뜨기전에 hang이 걸려있게 된다.
이번 단계에서 할 것이 gdb를 이용해서 attach를 하는것인데,
Metalkit에 심겨져있는 .elf 파일을 가지고 있어야지 디버깅을 할 수 있다.
micah@micah-64:~/metalkit/examples/apm-test$ gdb -q apm-test.elf
No symbol table is loaded. Use the "file" command.
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) set arch i386
The target architecture is assumed to be i386
(gdb) target remote localhost:8832
Remote debugging using localhost:8832
[New Thread 1]
0x000ffff0 in ?? ()
(gdb) break main
Breakpoint 1 at 0x100ba2: file main.c, line 11.
(gdb) cont
Continuing.
이제 VM 부팅이 표시됩니다. 더 일찍 중지해야 하는 경우 디버깅하려면 대신 *0x7c00에서 중단점을 설정할 수 있습니다.
보통. main() 에서 시작하는 것으로 충분합니다.
Metalkit이 로딩되자마자 중단점에 합니다. 지금부터 모든 일반 gdb command 는 사용할 수 있게 됩니다.
Breakpoint 1, main () at main.c:11
11 {
(gdb) list
6 #include "keyboard.h"
7 #include "apm.h"
8
9 int
10 main(void)
11 {
12 ConsoleVGA_Init();
13 Intr_Init();
14 Intr_SetFaultHandlers(Console_UnhandledFault);
15 Keyboard_Init();
(gdb) next
main () at main.c:12
12 ConsoleVGA_Init();
(gdb)
13 Intr_Init();
(gdb)
14 Intr_SetFaultHandlers(Console_UnhandledFault);
(gdb)
15 Keyboard_Init();
(gdb) p gConsole
$1 = {beginPanic = 0x1005ef <ConsoleVGABeginPanic>,
clear = 0x1004d2 <ConsoleVGAClear>,
moveTo = 0x1004c1 <ConsoleVGAMoveTo>,
writeChar = 0x100511 <ConsoleVGAWriteChar>,
flush = 0x100482 <ConsoleVGAMoveHardwareCursor>}
(gdb)