打印Frame Info
打印Frame Info值
最近在做JOS的系统实现,遇到一个小小的问题在于%.*s的用法。
> #include #include int main() { char *s = "this is test example"; int a,b; printf("%.*s\n", 10, s);//这里的常量10就是给*号的,你也可以用一个变量来控制宽度 printf("%*.*s\n", 20, 10, s);//常量20控制输出所占位宽,也可以用一个变量控制 std::cin>>a>>b; //输入15 10 printf("%*.*s\n", a, b, s);//输出为:-----this is te std::cin.get(); std::cin.ignore();//暂停程序执行 return 0; } </code> </pre> esp:寄存器存放当前线程的栈顶指针 ebp:寄存器存放当前线程的栈底指针 eip:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。 看汇编的时候,经常有 push ebp ; 保存当前ebp mov ebp,esp ; EBP设为当前堆栈指针 sub esp, xxx ; 预留xxx字节给函数临时变量. … 我们要遍历所有ebp,那就将ebp里面值取出,里面存的就是上个ebp的值!
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
int i;
unsigned int ebp = read_ebp();
struct Eipdebuginfo info;
char buffer[100];
cprintf("Stack backtrace:\n");
while(ebp!=0)
{
unsigned int eip = *((unsigned int *)ebp+1);
unsigned int args[5] = {0} ;
for(i= 0;i<5;i++)
args[i] = *((unsigned int *)ebp+ 2 + i);
cprintf(" ebp %08x eip %08x args %08x %08x %08x %08x %08x\n",ebp,eip,args[0],args[1],args[2],args[3],args[4]);
debuginfo_eip(eip,&info);
for(i=0;i<100&&i<info.eip_fn_namelen;i++)
buffer[i] = info.eip_fn_name[i];
buffer[i] = '\0';
cprintf(" %s:%d:%.*s+%d\n",info.eip_file, info.eip_line, info.eip_fn_namelen ,info.eip_fn_name ,eip-info.eip_fn_addr);
ebp = *((unsigned int *)ebp);
}
return 0;
}
打印结果: