Print symbolic args and line no's in stack traces.

This commit is contained in:
brezak 1993-07-10 03:25:02 +00:00
parent 842b58edb5
commit bb39e46611

View File

@ -24,11 +24,11 @@
* rights to redistribute these changes.
*/
/*
* $Id: db_aout.c,v 1.3 1993/05/20 03:39:06 cgd Exp $
* db_aout.c,v 1.3 1993/05/20 03:39:06 cgd Exp
*
* HISTORY
* $Log: db_aout.c,v $
* Revision 1.3 1993/05/20 03:39:06 cgd
* db_aout.c,v
* Revision 1.3 1993/05/20 03:39:06 cgd
* add explicit rcs id
*
* Revision 1.2 1993/05/07 09:13:53 cgd
@ -57,7 +57,9 @@
* Symbol table routines for a.out format files.
*/
#include "types.h"
#include "param.h"
#include "systm.h"
#include "proc.h"
#include <machine/db_machdep.h> /* data types */
#include <ddb/db_sym.h>
@ -66,6 +68,7 @@
#define _AOUT_INCLUDE_
#include "nlist.h"
#include "stab.h"
/*
* An a.out symbol table as loaded into the kernel debugger:
@ -185,13 +188,17 @@ X_db_search_symbol(symtab, off, strategy, diffp)
for (; sp < ep; sp++) {
if (sp->n_un.n_name == 0)
continue;
if ((sp->n_type & N_STAB) != 0)
if ((sp->n_type & N_STAB) != 0 || (sp->n_type & N_TYPE) == N_FN)
continue;
if (off >= sp->n_value) {
if (off - sp->n_value < diff) {
diff = off - sp->n_value;
symp = sp;
if (diff == 0)
if (diff == 0 &&
(strategy == DB_STGY_PROC &&
sp->n_type == (N_TEXT|N_EXT) ||
strategy == DB_STGY_ANY &&
(sp->n_type & N_EXT)))
break;
}
else if (off - sp->n_value == diff) {
@ -230,12 +237,111 @@ X_db_symbol_values(sym, namep, valuep)
*valuep = sp->n_value;
}
boolean_t
X_db_line_at_pc()
X_db_line_at_pc(symtab, cursym, filename, linenum, off)
db_symtab_t * symtab;
db_sym_t cursym;
char **filename;
int *linenum;
db_expr_t off;
{
register struct nlist *sp, *ep;
register struct nlist *sym = (struct nlist *)cursym;
unsigned long sodiff = -1UL, lndiff = -1UL, ln = 0;
char *fname = NULL;
sp = (struct nlist *)symtab->start;
ep = (struct nlist *)symtab->end;
/* XXX - gcc specific */
#define NEWSRC(str) ((str) != NULL && \
(str)[0] == 'g' && strcmp((str), "gcc_compiled.") == 0)
for (; sp < ep; sp++) {
/*
* Prevent bogus linenumbers in case module not compiled
* with debugging options
*/
#if 0
if (sp->n_value <= off && (off - sp->n_value) <= sodiff &&
NEWSRC(sp->n_un.n_name)) {
#endif
if ((sp->n_type & N_TYPE) == N_FN || NEWSRC(sp->n_un.n_name)) {
sodiff = lndiff = -1UL;
ln = 0;
fname = NULL;
}
if (sp->n_type == N_SO) {
if (sp->n_value <= off && (off - sp->n_value) < sodiff) {
sodiff = off - sp->n_value;
fname = sp->n_un.n_name;
}
continue;
}
if (sp->n_type != N_SLINE)
continue;
if (sp->n_value > off)
break;
if (off - sp->n_value < lndiff) {
lndiff = off - sp->n_value;
ln = sp->n_desc;
}
}
if (fname != NULL && ln != 0) {
*filename = fname;
*linenum = ln;
return TRUE;
}
return (FALSE);
}
boolean_t
X_db_sym_numargs(symtab, cursym, nargp, argnamep)
db_symtab_t * symtab;
db_sym_t cursym;
int *nargp;
char **argnamep;
{
register struct nlist *sp, *ep;
u_long addr;
int maxnarg = *nargp, nargs = 0;
if (cursym == NULL)
return FALSE;
addr = ((struct nlist *)cursym)->n_value;
sp = (struct nlist *)symtab->start;
ep = (struct nlist *)symtab->end;
for (; sp < ep; sp++) {
if (sp->n_type == N_FUN && sp->n_value == addr) {
while (++sp < ep && sp->n_type == N_PSYM) {
if (nargs >= maxnarg)
break;
nargs++;
*argnamep++ = sp->n_un.n_name?sp->n_un.n_name:"???";
{
/* XXX - remove trailers */
char *cp = *(argnamep-1);
while (*cp != '\0' && *cp != ':') cp++;
if (*cp == ':') *cp = '\0';
}
}
*nargp = nargs;
return TRUE;
}
}
return FALSE;
}
/*
* Initialization routine for a.out files.
*/
@ -246,11 +352,11 @@ kdb_init()
extern int end;
if (esym > (char *)&end) {
X_db_sym_init((int *)&end, esym, "mach");
X_db_sym_init((int *)&end, esym, "netbsd");
}
#endif
X_db_sym_init (db_symtab, 0, "mach");
X_db_sym_init (db_symtab, 0, "netbsd");
}
#if 0