V9/cmd/coreid.c
/*
*
* coreid [corefile] - display arguments of program that dumped core
*
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/dir.h>
#include <sys/user.h>
#include <machine/reg.h>
#include <sys/vm.h>
#define HSIZE ctob(UPAGES)
struct user u;
int coref;
char *core="core";
int value;
char cvalue;
unsigned enddata, startdata;
unsigned startstack;
int nchars;
long lseek();
main(argc, argv)
char *argv[];
{
register fp, av, ap, env;
int *r;
char *cp;
int envflg = 0;
while (argc > 1 && argv[1][0] == '-') {
if (argv[1][1] == 'e')
envflg++;
else {
fprintf(stderr, "usage: coreid [-e] [corefile]\n", core);
exit(1);
}
argc--;
argv++;
}
if(argc > 1)
core=argv[1];
coref=open(core, 0);
if(coref < 0){
fprintf(stderr, "coreid: can't open %s\n", core);
exit(1);
}
if (read(coref, (char *)&u, sizeof(u)) != sizeof(u)){
fprintf(stderr, "coreid: read U area %s\n", core);
exit(1);
}
startdata=ctob(stoc(ctos(u.u_tsize + 1))); /* address after text */
enddata=startdata+ctob(u.u_dsize); /* after data & bss */
startstack = KERNELBASE - ctob(u.u_ssize);
cp = (char *)&u;
r = (int *)&cp[((int)u.u_ar0) & 0x1fff];
fp= r[AR6];
for(;;){
Seek(fp);
Read();
if(value<fp)
break;
fp=value;
}
av=fp+20; /* Don't use arg, becuase of argv++ possibility */
for(;;){
Seek(av);
Read();
if(value==0)
break;
string();
av+=sizeof(char *);
}
if(nchars==0)
badcore();
if (envflg) {
env=fp+16; /* It's the third argument */
Seek(env);
Read();
env=value;
for(;;){
Seek(env);
Read();
if(value==0)
break;
printf("\n\t");
string();
env+=sizeof(char *);
}
}
putchar('\n');
}
Seek(loc)
register loc;
{
if(loc > enddata){
if(lseek(coref, (loc - startstack) + HSIZE + ctob(u.u_dsize), 0)==-1L)
badcore();
}else if(lseek(coref, (unsigned)loc-startdata+HSIZE, 0)==-1L)
badcore();
}
Read()
{
if(read(coref, &value, sizeof (int))!=sizeof (int))
badcore();
}
Readc()
{
if(read(coref, &cvalue, 1)!=1)
badcore();
}
string()
{
Seek(value);
do{
Readc();
if(cvalue){
putchar(cvalue);
nchars++;
}
}while(cvalue);
putchar(' ');
}
badcore()
{
u.u_comm[DIRSIZ+1]=0;
printf("(%s)\n", u.u_comm);
exit(0);
}