stacktrace.c,v
来自「TCP-IP红宝书源代码」· C,V 代码 · 共 91 行
C,V
91 行
head 1.1;
access;
symbols;
locks
dls:1.1; strict;
comment @ * @;
1.1
date 97.09.21.19.29.30; author dls; state Dist;
branches;
next ;
desc
@@
1.1
log
@pre-3e code
@
text
@/* stacktrace.c - stacktrace */
#include <conf.h>
#include <kernel.h>
#include <proc.h>
static unsigned long *esp;
static unsigned long *ebp;
/*------------------------------------------------------------------------
* stacktrace - print a stack backtrace for a process
*------------------------------------------------------------------------
*/
int
stacktrace(pid, fd)
unsigned int pid;
unsigned int fd;
{
struct pentry *proc = &proctab[pid];
unsigned long *sp, *fp;
if (pid != 0 && isbadpid(pid))
return SYSERR;
if (pid == currpid) {
asm("movl %esp,_esp");
asm("movl %ebp,_ebp");
sp = esp;
fp = ebp;
} else {
sp = (unsigned long *)proc->pesp;
fp = sp + 2; /* where ctxsw leaves it */
}
fprintf(fd, "currpid %d lastpid %d\n", currpid, lastpid);
fprintf(fd, "sp %X fp %X base %X\n", sp, fp, proc->pbase);
kprintf("currpid %d lastpid %d\n", currpid, lastpid);
kprintf("sp %X fp %X base %X\n", sp, fp, proc->pbase);
while (sp < proc->pbase) {
for (; sp < fp; sp++)
{
fprintf(fd, "DATA (%08X) %08X (%d)\n", sp, *sp, *sp);
kprintf("DATA (%08X) %08X (%d)\n", sp, *sp, *sp);
}
if (*sp == MAGIC)
break;
fprintf(fd, "\nFP (%08X) %08X (%d)\n", sp, *sp, *sp);
kprintf("\nFP (%08X) %08X (%d)\n", sp, *sp, *sp);
fp = (unsigned long *) *sp++;
if (fp <= sp) {
kprintf("bad stack, fp (%08X) <= sp (%08X)\n", fp, sp);
fprintf(fd, "bad stack, fp (%08X) <= sp (%08X)\n",
fp, sp);
return SYSERR;
}
fprintf(fd, "RET 0x%X\n", *sp);
kprintf("RET 0x%X\n", *sp);
sp++;
}
fprintf(fd, "MAGIC (should be %X): %X\n", MAGIC, *sp);
kprintf("MAGIC (should be %X): %X\n", MAGIC, *sp);
if (sp != proc->pbase) {
fprintf(fd, "unexpected short stack\n");
kprintf("unexpected short stack\n");
return SYSERR;
}
return OK;
}
@
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?