200 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Id$ */
 | |
| /*
 | |
|  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | |
|  * See the copyright notice in the ACK home directory, in the file "Copyright".
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /* Author: E.G. Keizer */
 | |
| 
 | |
| /* Print a readable version of the data in the post mortem dump */
 | |
| /* dmpc [-s] [-dn,m] [file] */
 | |
| 
 | |
| #include <local.h>
 | |
| #include <stdio.h>
 | |
| #include <ctype.h>
 | |
| 
 | |
| int dflag = 0 ;
 | |
| long l_low,l_high;
 | |
| 
 | |
| int sflag;
 | |
| 
 | |
| int wsize,asize;
 | |
| long tsize,dsize;
 | |
| long ignmask,uerrorproc,cause;
 | |
| long pc,sp,lb,hp,pd,pb;
 | |
| 
 | |
| char *cstr[] = {
 | |
| 	"Array bound error",
 | |
| 	"Range bound error",
 | |
| 	"Set error",
 | |
| 	"Integer overflow",
 | |
| 	"Float overflow",
 | |
| 	"Float underflow",
 | |
| 	"Divide by 0",
 | |
| 	"Divide by 0.0",
 | |
| 	"Integer undefined",
 | |
| 	"Float undefined",
 | |
| 	"Conversion error",
 | |
| 	"User error 11",
 | |
| 	"User error 12",
 | |
| 	"User error 13",
 | |
| 	"User error 14",
 | |
| 	"User error 15",
 | |
| 	"Stack overflow",
 | |
| 	"Heap overflow",
 | |
| 	"Illegal instruction",
 | |
| 	"Illegal size parameter",
 | |
| 	"Case error",
 | |
| 	"Memory fault",
 | |
| 	"Illegal pointer",
 | |
| 	"Illegal pc",
 | |
| 	"Bad argument of LAE",
 | |
| 	"Bad monitor call",
 | |
| 	"Bad line number",
 | |
| 	"GTO descriptor error"
 | |
| };
 | |
| 
 | |
| FILE *fcore;
 | |
| char *core = "core" ;
 | |
| int nbyte=0;
 | |
| 
 | |
| char *pname;
 | |
| 
 | |
| int readbyte();
 | |
| int read2();
 | |
| long readaddr();
 | |
| long readword();
 | |
| unsigned getbyte();
 | |
| long getword();
 | |
| long getaddr();
 | |
| 
 | |
| main(argc,argv) char **argv;
 | |
| {
 | |
| 	register i ;
 | |
| 	long line,fileaddr;
 | |
| 	char tok ;
 | |
| 
 | |
| 	scanargs(argc,argv); fcore=fopen(core,"r") ;
 | |
| 	if ( fcore==NULL ) fatal("Can't open %s",core) ;
 | |
| 
 | |
| 	if ( read2()!=010255 ) fatal("not a post mortem dump");
 | |
| 	if ( read2()!=VERSION ) fatal("wrong version dump file");
 | |
| 	wsize=read2(); asize=read2();
 | |
| 	if ( wsize>4 ) fatal("cannot handle word size %d",wsize) ;
 | |
| 	if ( asize>4 ) fatal("cannot handle pointer size %d",asize) ;
 | |
| 	tsize=readaddr(); dsize=readaddr();
 | |
| 	ignmask=readaddr(); uerrorproc=readaddr(); cause=readaddr();
 | |
| 	pc=readaddr(); sp=readaddr(); lb=readaddr(); hp=readaddr();
 | |
| 	pd=readaddr(); pb=readaddr();
 | |
| 	if ( sflag==0 ) {
 | |
| 		line=getword(0L);
 | |
| 		fileaddr=getaddr(4L);
 | |
| 		if ( fileaddr ) {
 | |
| 			for ( i=0 ; i<40 ; i++ ) {
 | |
| 				tok=getbyte(fileaddr++) ;
 | |
| 				if ( !isprint(tok) ) break ;
 | |
| 				putc(tok,stdout);
 | |
| 			}
 | |
| 			printf(" ");
 | |
| 		}
 | |
| 		if ( line ) {
 | |
| 			printf("line %ld",line) ;
 | |
| 		}
 | |
| 		if ( fileaddr || line ) printf(", ");
 | |
| 		fseek(fcore,512L,0);
 | |
| 
 | |
| 		if ( cause>27 ) {
 | |
| 			printn("cause",cause) ;
 | |
| 		} else {
 | |
| 			prints("cause",cstr[(int)cause]);
 | |
| 		}
 | |
| 		printn("pc",pc);printn("sp",sp);printn("lb",lb);
 | |
| 		printn("hp",hp);
 | |
| 		if ( pd ) printn("pd",pd) ;
 | |
| 		if ( pb ) printn("pb",pb) ;
 | |
| 		printn("errproc",uerrorproc) ;
 | |
| 		printn("ignmask",ignmask) ;
 | |
| 		if ( tsize ) printn("Text size",tsize) ;
 | |
| 		if ( dsize ) printn("Data size",dsize) ;
 | |
| 	}
 | |
| 	if ( dflag==0 ) exit(0);
 | |
| 	fatal("d-flag not implemeted (yet)");
 | |
| 	exit(1) ;
 | |
| }
 | |
| 
 | |
| scanargs(argc,argv) char **argv ; {
 | |
| 	pname=argv[0];
 | |
| 	while ( argv++, argc-- > 1 ) {
 | |
| 		switch( argv[0][0] ) {
 | |
| 		case '-':    switch( argv[0][1] ) {
 | |
| 				case 's':    sflag++ ; break ;
 | |
| 				case 'l':    dflag++ ; break ;
 | |
| 				default : fatal(": [-s] [-ln.m] [file]") ;
 | |
| 			} ;
 | |
| 			break ;
 | |
| 		default :core=argv[0] ;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| prints(s1,s2) char *s1,*s2; {
 | |
| 	printf("%-15s %s\n",s1,s2);
 | |
| }
 | |
| 
 | |
| printn(s1,d) char *s1; long d; {
 | |
| 	printf("%-15s %15ld\n",s1,d);
 | |
| }
 | |
| 
 | |
| /* VARARGS1 */
 | |
| fatal(s1,p1,p2,p3,p4,p5) char *s1 ; {
 | |
| 	fprintf(stderr,"%s: ",pname);
 | |
| 	fprintf(stderr,s1,p1,p2,p3,p4,p5) ;
 | |
| 	fprintf(stderr,"\n") ;
 | |
| 	exit(1) ;
 | |
| }
 | |
| 
 | |
| int getb() {
 | |
| 	int i ;
 | |
| 	i=getc(fcore) ;
 | |
| 	if ( i==EOF ) fatal("Premature EOF");
 | |
| 	return i&0377 ;
 | |
| }
 | |
| 
 | |
| int read2() {
 | |
| 	int i ;
 | |
| 	i=getb() ; return getb()*256 + i ;
 | |
| }
 | |
| 
 | |
| long readaddr() {
 | |
| 	long res ;
 | |
| 	register int i ;
 | |
| 
 | |
| 	res=0 ;
 | |
| 	for (i=0 ; i<asize ; i++ ) res |= getb()<<(8*i) ;
 | |
| 	return res ;
 | |
| }
 | |
| 
 | |
| long readword() {
 | |
| 	long res ;
 | |
| 	register int i ;
 | |
| 
 | |
| 	res=0 ;
 | |
| 	for (i=0 ; i<wsize ; i++ ) res |= getb()<<(8*i) ;
 | |
| 	return res ;
 | |
| }
 | |
| 
 | |
| unsigned getbyte(a) long a ; {
 | |
| 	fseek(fcore,a+512,0) ;
 | |
| 	return getb() ;
 | |
| }
 | |
| 
 | |
| long getword(a) long a ; {
 | |
| 	fseek(fcore,a+512,0) ;
 | |
| 	return readword() ;
 | |
| }
 | |
| 
 | |
| long getaddr(a) long a ; {
 | |
| 	fseek(fcore,a+512,0) ;
 | |
| 	return readaddr() ;
 | |
| }
 |