📄 debug.c
字号:
/*****************************************************************************
DEBUG ROUTINES
EXPORTS:
void dump_stack_frame(unsigned curr_ebp, unsigned max_ebp);
void dump(unsigned char *data, unsigned count);
void dump_regs(regs_t *regs);
void dump_task(task_t *task);
void dump_page_tables(unsigned long *page_dir);
*****************************************************************************/
#include <krnl.h> /* task_t, regs_t, unsigned long, kprintf() */
/* IMPORTS
from MAIN.C */
void kprintf(const char *fmt, ...);
/*****************************************************************************
*****************************************************************************/
void dump_stack_frame(unsigned curr_ebp, unsigned max_ebp)
{
unsigned *esp;
kprintf("return addresses from stack frames:\n");
while(curr_ebp < max_ebp)
{
esp = (unsigned *)curr_ebp; /* mov esp,ebp */
curr_ebp = *esp++; /* pop ebp */
kprintf("%08X ", *esp); /* return EIP at [esp + 0] */
esp++;
}
kprintf("\n");
}
/*****************************************************************************
*****************************************************************************/
#define BPERL 16 /* byte/line for dump */
void dump(unsigned char *data, unsigned count)
{
unsigned char byte1, byte2;
while(count != 0)
{
for(byte1 = 0; byte1 < BPERL; byte1++)
{
if(count == 0)
break;
kprintf("%02X ", data[byte1]);
count--;
}
kprintf("\t");
for(byte2 = 0; byte2 < byte1; byte2++)
{
if(data[byte2] < ' ')
kprintf(".");
else
kprintf("%c", data[byte2]);
}
kprintf("\n");
data += BPERL;
}
}
/*****************************************************************************
*****************************************************************************/
void dump_regs(regs_t *regs)
{
kprintf("EDI=%08X ESI=%08X EBP=%08X ESP=%08X EBX=%08X\n",
regs->edi, regs->esi, regs->ebp, regs->esp, regs->ebx);
kprintf("EDX=%08X ECX=%08X EAX=%08X DS=%08X ES=%08X\n",
regs->edx, regs->ecx, regs->eax, regs->ds, regs->es);
kprintf(" FS=%08X GS=%08X intnum=%08X error=%08X EIP=%08X\n",
regs->fs, regs->gs, regs->which_int, regs->err_code,
regs->eip);
kprintf(" CS=%08X EFLAGS=%08X uESP=%08X uSS=%08X\n",
regs->cs, regs->eflags, regs->user_esp, regs->user_ss);
}
/*****************************************************************************
*****************************************************************************/
void dump_task(task_t *task)
{
dump_regs((regs_t *)task->krnl_esp);
kprintf("CR3=%08X init kernel ESP=%08X "
"kernel ESP=%08X\n", task->page_dir,
task->init_krnl_esp, task->krnl_esp);
}
/*****************************************************************************
*****************************************************************************/
void dump_page_tables(unsigned long *page_dir)
{
unsigned long temp, *page_tab;
unsigned long pde, pte;
kprintf("page directory at 0x%8lX", page_dir);
/* show all pages */
for(pde = 0; pde < 1024; pde++)
/* show only user pages */
// for(pde = ADR2PDE(USER_BOT); pde < ADR2PDE(USER_TOP); pde++)
{
if(page_dir[pde] == 0)
continue;
temp = page_dir[pde];
/* show page directory entries in bright white */
kprintf("\n""\x1B[1m""page dir[%4u]=0x%8lX""\x1B[0m",
pde, temp);
page_tab = (unsigned long *)(temp & -4096);
/* */
if(pde < 256 || pde >= 768)
{
for(pte = 0; pte < 2; pte++)
{
if(page_tab[pte] == 0)
continue;
temp = page_tab[pte];
kprintf("\n page tab[%4u]=0x%8lX",
pte, temp);
}
pte = 1023;
}
else
pte = 0;
for(; pte < 1024; pte++)
{
if(page_tab[pte] == 0)
continue;
temp = page_tab[pte];
kprintf("\n page tab[%4u]=0x%8lX", pte, temp);
}
}
kprintf("\n\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -