⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbols.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <bio.h>#include <mach.h>#include "arm.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.r[15];	sp = reg.r[13];	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[14];		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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -