211 lines
4.1 KiB
C
211 lines
4.1 KiB
C
|
/*
|
||
|
* (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||
|
*
|
||
|
* This product is part of the Amsterdam Compiler Kit.
|
||
|
*
|
||
|
* Permission to use, sell, duplicate or disclose this software must be
|
||
|
* obtained in writing. Requests for such permissions may be sent to
|
||
|
*
|
||
|
* Dr. Andrew S. Tanenbaum
|
||
|
* Wiskundig Seminarium
|
||
|
* Vrije Universiteit
|
||
|
* Postbox 7161
|
||
|
* 1007 MC Amsterdam
|
||
|
* The Netherlands
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/* Author: E.G. Keizer */
|
||
|
|
||
|
/* Print a readable version of the data in the post mortem dump */
|
||
|
/* dmpc [-s] [-dn,m] [file] */
|
||
|
|
||
|
#include "/usr/em/h/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 %D",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 ) return 0;
|
||
|
fatal("d-flag not implemeted (yet)");
|
||
|
return 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() ;
|
||
|
}
|