symbols.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 97 行

C
97
字号
#include <u.h>#include <libc.h>#include <bio.h>#include <mach.h>#define Extern extern#include "mips.h"#define	STRINGSZ	128/* *	print the value of dot as file:line */voidprintsource(long dot){	char str[STRINGSZ];	if (fileline(str, STRINGSZ, dot))		Bprint(bioout, "%s", str);}voidprintlocals(Symbol *fn, ulong fp){	int i;	Symbol s;	s = *fn;	for (i = 0; localsym(&s, i); i++) {		if (s.class != CAUTO)			continue;		Bprint(bioout, "\t%s=#%lux\n", s.name, getmem_4(fp-s.value));	}}voidprintparams(Symbol *fn, ulong fp){	int i;	Symbol s;	int first;	fp += mach->szreg;			/* skip saved pc */	s = *fn;	for (first = i = 0; localsym(&s, i); i++) {		if (s.class != CPARAM)			continue;		if (first++)			Bprint(bioout, ", ");		Bprint(bioout, "%s=#%lux", s.name, getmem_4(fp+s.value));	}	Bprint(bioout, ") ");}#define STARTSYM	"_main"#define	FRAMENAME	".frame"voidstktrace(int modif){	ulong pc, sp;	Symbol s, f;	int i;	char buf[512];	pc = reg.pc;	sp = reg.r[29];	i = 0;	while (findsym(pc, CTEXT, &s)) {		if(strcmp(STARTSYM, s.name) == 0) {			Bprint(bioout, "%s() at #%llux\n", s.name, s.value);			break;		}		if (pc == s.value)	/* at first instruction */			f.value = 0;		else if (findlocal(&s, FRAMENAME, &f) == 0)			break;		if (s.type == 'L' || s.type == 'l' || pc <= s.value+4)			pc = reg.r[31];		else pc = getmem_4(sp);		sp += f.value;		Bprint(bioout, "%s(", s.name);		printparams(&s, sp);		printsource(s.value);		Bprint(bioout, " called from ");		symoff(buf, sizeof(buf), pc-8, CTEXT);		Bprint(bioout, buf);		printsource(pc-8);		Bprint(bioout, "\n");		if(modif == 'C')			printlocals(&s, sp);		if(++i > 40){			Bprint(bioout, "(trace truncated)\n");			break;		}	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?