ps -k bugs
utzoo!decvax!pur-ee!purdue!cak
utzoo!decvax!pur-ee!purdue!cak
Fri Jan 15 19:14:52 AEST 1982
We experienced crashes upon converting to 4.1 and wanted to use
ps k to analyze the dumps -- only to find it doesn't work at all.
After much digging through, I determined that ps k ignores the
fact that the addresses found in the namelist, etc. all begin
at 0x80000000, which is way beyond the end of the core dump. The
changes follow:
*** /usr/src/cmd/ps.c Fri Jan 15 18:48:52 1982
--- /usr/src/cmd/ps.c.v0 Wed Jan 13 13:24:48 1982
***************
*** 223,229
hz = getw(nl[X_HZ].n_value);
savcom = (struct savcom *)calloc(nproc, sizeof (*savcom));
for (i=0; i<nproc; i += 8) {
! kseek(kmem, (char *)procp, 0);
j = nproc - i;
if (j > 8)
j = 8;
--- 223,229 -----
hz = getw(nl[X_HZ].n_value);
savcom = (struct savcom *)calloc(nproc, sizeof (*savcom));
for (i=0; i<nproc; i += 8) {
! lseek(kmem, (char *)procp, 0);
j = nproc - i;
if (j > 8)
j = 8;
***************
*** 228,234
if (j > 8)
j = 8;
j *= sizeof (struct proc);
! if ( read(kmem, (char *)proc, j) != j){
cantread("proc table", kmemf);
exit(1);
}
--- 228,234 -----
if (j > 8)
j = 8;
j *= sizeof (struct proc);
! if (read(kmem, (char *)proc, j) != j)
cantread("proc table", kmemf);
procp += j;
for (j = j / sizeof (struct proc) - 1; j >= 0; j--) {
***************
*** 230,237
j *= sizeof (struct proc);
if ( read(kmem, (char *)proc, j) != j){
cantread("proc table", kmemf);
- exit(1);
- }
procp += j;
for (j = j / sizeof (struct proc) - 1; j >= 0; j--) {
mproc = &proc[j];
--- 230,235 -----
j *= sizeof (struct proc);
if (read(kmem, (char *)proc, j) != j)
cantread("proc table", kmemf);
procp += j;
for (j = j / sizeof (struct proc) - 1; j >= 0; j--) {
mproc = &proc[j];
***************
*** 289,295
{
long word;
! kseek(kmem, loc, 0);
if (read(kmem, &word, sizeof (word)) != sizeof (word))
printf("error reading kmem at %x\n", loc);
return (word);
--- 287,293 -----
{
long word;
! lseek(kmem, loc, 0);
if (read(kmem, &word, sizeof (word)) != sizeof (word))
printf("error reading kmem at %x\n", loc);
return (word);
***************
*** 330,336
char **argv;
{
register struct nlist *nlp;
- int i;
nlistf = argc > 3 ? argv[3] : "/vmunix";
nlist(nlistf, nl);
--- 328,333 -----
char **argv;
{
register struct nlist *nlp;
nlistf = argc > 3 ? argv[3] : "/vmunix";
nlist(nlistf, nl);
***************
*** 343,349
nlp->n_value = clear(nlp->n_value);
Usrptma = (struct pte *)nl[X_USRPTMA].n_value;
usrpt = (struct pte *)nl[X_USRPT].n_value;
! kseek(kmem, (long)nl[X_NSWAP].n_value, 0);
if (read(kmem, &nswap, sizeof (nswap)) != sizeof (nswap)) {
cantread("nswap", kmemf);
exit(1);
--- 340,346 -----
nlp->n_value = clear(nlp->n_value);
Usrptma = (struct pte *)nl[X_USRPTMA].n_value;
usrpt = (struct pte *)nl[X_USRPT].n_value;
! lseek(kmem, (long)nl[X_NSWAP].n_value, 0);
if (read(kmem, &nswap, sizeof (nswap)) != sizeof (nswap)) {
cantread("nswap", kmemf);
exit(1);
***************
*** 348,354
cantread("nswap", kmemf);
exit(1);
}
! kseek(kmem, (long)nl[X_MAXSLP].n_value, 0);
if (read(kmem, &maxslp, sizeof (maxslp)) != sizeof (maxslp)) {
cantread("maxslp", kmemf);
exit(1);
--- 345,351 -----
cantread("nswap", kmemf);
exit(1);
}
! lseek(kmem, (long)nl[X_MAXSLP].n_value, 0);
if (read(kmem, &maxslp, sizeof (maxslp)) != sizeof (maxslp)) {
cantread("maxslp", kmemf);
exit(1);
***************
*** 353,359
cantread("maxslp", kmemf);
exit(1);
}
! kseek(kmem, (long)nl[X_CCPU].n_value, 0);
if (read(kmem, &ccpu, sizeof (ccpu)) != sizeof (ccpu)) {
cantread("ccpu", kmemf);
exit(1);
--- 350,356 -----
cantread("maxslp", kmemf);
exit(1);
}
! lseek(kmem, (long)nl[X_CCPU].n_value, 0);
if (read(kmem, &ccpu, sizeof (ccpu)) != sizeof (ccpu)) {
cantread("ccpu", kmemf);
exit(1);
***************
*** 358,364
cantread("ccpu", kmemf);
exit(1);
}
! kseek(kmem, (long)nl[X_ECMX].n_value, 0);
if (read(kmem, &ecmx, sizeof (ecmx)) != sizeof (ecmx)) {
cantread("ecmx", kmemf);
exit(1);
--- 355,361 -----
cantread("ccpu", kmemf);
exit(1);
}
! lseek(kmem, (long)nl[X_ECMX].n_value, 0);
if (read(kmem, &ecmx, sizeof (ecmx)) != sizeof (ecmx)) {
cantread("ecmx", kmemf);
exit(1);
***************
*** 371,377
exit(1);
}
atext = (struct text *)getw(nl[X_TEXT].n_value);
! kseek(kmem, (int)atext, 0);
if (read(kmem, (char *)text, ntext * sizeof (struct text))
!= ntext * sizeof (struct text)) {
cantread("text table", kmemf);
--- 368,374 -----
exit(1);
}
atext = (struct text *)getw(nl[X_TEXT].n_value);
! lseek(kmem, (int)atext, 0);
if (read(kmem, (char *)text, ntext * sizeof (struct text))
!= ntext * sizeof (struct text)) {
cantread("text table", kmemf);
***************
*** 400,406
char *what, *fromwhat;
{
! fprintf(stderr, "ps: error reading %s from %s\n", what, fromwhat);
}
struct direct dbuf;
--- 397,403 -----
char *what, *fromwhat;
{
! fprintf(stderr, "ps: error reading %s from %s", what, fromwhat);
}
struct direct dbuf;
***************
*** 701,707
size = sflg ? ctob(UPAGES) : sizeof (struct user);
if ((mproc->p_flag & SLOAD) == 0) {
! kseek(swap, ctob(mproc->p_swaddr), 0);
if (read(swap, (char *)&user.user, size) != size) {
fprintf(stderr, "ps: cant read u for pid %d from %s\n",
mproc->p_pid, swapf);
--- 698,704 -----
size = sflg ? ctob(UPAGES) : sizeof (struct user);
if ((mproc->p_flag & SLOAD) == 0) {
! lseek(swap, ctob(mproc->p_swaddr), 0);
if (read(swap, (char *)&user.user, size) != size) {
fprintf(stderr, "ps: cant read u for pid %d from %s\n",
mproc->p_pid, swapf);
***************
*** 711,719
argaddr = 0;
return (1);
}
! pteaddr = &Usrptma[btokmx(kflg?(struct pte *)clear(mproc->p_p0br):
! mproc->p_p0br) + mproc->p_szpt - 1];
! kseek(kmem, (long)pteaddr, 0);
if (read(kmem, (char *)&apte, sizeof(apte)) != sizeof(apte)) {
printf("ps: cant read indir pte to get u for pid %d from %s\n",
mproc->p_pid, swapf);
--- 708,715 -----
argaddr = 0;
return (1);
}
! pteaddr = &Usrptma[btokmx(mproc->p_p0br) + mproc->p_szpt - 1];
! lseek(kmem, kflg ? clear(pteaddr) : (int)pteaddr, 0);
if (read(kmem, (char *)&apte, sizeof(apte)) != sizeof(apte)) {
printf("ps: cant read indir pte to get u for pid %d from %s\n",
mproc->p_pid, swapf);
***************
*** 719,725
mproc->p_pid, swapf);
return (0);
}
! kseek(mem,
ctob(apte.pg_pfnum+1) - (UPAGES+CLSIZE) * sizeof (struct pte), 0);
if (read(mem, (char *)arguutl, sizeof(arguutl)) != sizeof(arguutl)) {
printf("ps: cant read page table for u of pid %d from %s\n",
--- 715,721 -----
mproc->p_pid, swapf);
return (0);
}
! lseek(mem,
ctob(apte.pg_pfnum+1) - (UPAGES+CLSIZE) * sizeof (struct pte), 0);
if (read(mem, (char *)arguutl, sizeof(arguutl)) != sizeof(arguutl)) {
printf("ps: cant read page table for u of pid %d from %s\n",
***************
*** 734,740
ncl = (size + NBPG*CLSIZE - 1) / (NBPG*CLSIZE);
while (--ncl >= 0) {
i = ncl * CLSIZE;
! kseek(mem, ctob(arguutl[CLSIZE+i].pg_pfnum), 0);
if (read(mem, user.upages[i], CLSIZE*NBPG) != CLSIZE*NBPG) {
printf("ps: cant read page %d of u of pid %d from %s\n",
arguutl[CLSIZE+i].pg_pfnum, mproc->p_pid, memf);
--- 730,736 -----
ncl = (size + NBPG*CLSIZE - 1) / (NBPG*CLSIZE);
while (--ncl >= 0) {
i = ncl * CLSIZE;
! lseek(mem, ctob(arguutl[CLSIZE+i].pg_pfnum), 0);
if (read(mem, user.upages[i], CLSIZE*NBPG) != CLSIZE*NBPG) {
printf("ps: cant read page %d of u of pid %d from %s\n",
arguutl[CLSIZE+i].pg_pfnum, mproc->p_pid, memf);
***************
*** 768,774
}
if ((mproc->p_flag & SLOAD) == 0 || argaddr == 0) {
vstodb(0, CLSIZE, &u.u_smap, &db, 1);
! kseek(swap, ctob(db.db_base), 0);
if (read(swap, (char *)&argspac, sizeof(argspac))
!= sizeof(argspac))
goto bad;
--- 764,770 -----
}
if ((mproc->p_flag & SLOAD) == 0 || argaddr == 0) {
vstodb(0, CLSIZE, &u.u_smap, &db, 1);
! lseek(swap, ctob(db.db_base), 0);
if (read(swap, (char *)&argspac, sizeof(argspac))
!= sizeof(argspac))
goto bad;
***************
*** 773,779
!= sizeof(argspac))
goto bad;
} else {
! kseek(mem, argaddr, 0);
if (read(mem, (char *)&argspac, sizeof (argspac))
!= sizeof (argspac))
goto bad;
--- 769,775 -----
!= sizeof(argspac))
goto bad;
} else {
! lseek(mem, argaddr, 0);
if (read(mem, (char *)&argspac, sizeof (argspac))
!= sizeof (argspac))
goto bad;
***************
*** 1115,1134
dp = (char *)alloc(len+1);
strcpy(dp, cp);
return (dp);
- }
-
- /*
- * make sure the addresses are reasonable when using the
- * k flag for post mortem debugging. cak 1/14/82
- */
-
- kseek(fd, offset, whence)
- int fd;
- long offset;
- int whence;
- {
- if(kflg && (fd == kmem))
- offset = (long)clear(offset);
-
- lseek(fd, offset, whence);
}
--- 1111,1114 -----
dp = (char *)alloc(len+1);
strcpy(dp, cp);
return (dp);
}
Chris Kent
More information about the Comp.bugs.4bsd.ucb-fixes
mailing list