git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@944 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2000-11-11 22:24:43 +00:00
commit e4444a5c78
10 changed files with 123 additions and 129 deletions

View file

@ -156,11 +156,12 @@ extern long wad_steal_outarg(WadFrame *f, char *symbol, int argno, int *error);
extern char *wad_arg_string(WadFrame *f);
typedef struct {
const char *name;
char name[128];
long value;
} WadReturnFunc;
extern void wad_set_returns(WadReturnFunc *rf);
extern WadReturnFunc *wad_check_return(const char *name);
/* --- Debugging Interface --- */
@ -170,10 +171,10 @@ extern void wad_set_returns(WadReturnFunc *rf);
#define DEBUG_OBJECT 0x8
#define DEBUG_FILE 0x10
#define DEBUG_HOLD 0x20
#define DEBUG_RETURN 0x40
extern int wad_debug_mode;
extern char *wad_cplus_demangle(WadSymbol *wsym);
#ifdef __cplusplus

View file

@ -1,8 +1,9 @@
SRCS = default.c stack.c stab.c elf.c object.c init.c segment.c signal.c
OBJS = default.o stack.o stab.o elf.o object.o signal.o segment.o init.o main.o
SRCS = demangle.c return.c default.c stack.c stab.c elf.c object.c init.c segment.c signal.c
OBJS = demangle.o return.o default.o stack.o stab.o elf.o object.o signal.o segment.o init.o main.o
INCLUDE = -I../Include -I.
OPT = -DWAD_SOLARIS
LIBS =
PYINCLUDE = -I/usr/local/include/python2.0
TCLINCLUDE = -I/usr/local/include
@ -10,19 +11,19 @@ TCLINCLUDE = -I/usr/local/include
all::
CC -Kpic -c $(OPT) $(INCLUDE) main.cxx
cc -c $(OPT) $(INCLUDE) $(SRCS)
CC -G $(OBJS) -o libwad.so
CC -G $(OBJS) -o libwad.so $(LIBS)
cp libwad.so ..
python::
cc -c $(INCLUDE) $(SRCS)
cc -c $(OPT) $(INCLUDE) $(SRCS)
CC -Kpic -c $(INCLUDE) $(PYINCLUDE) wadpy.cxx
CC -G $(OBJS) wadpy.o -o libwadpy.so
CC -G $(OBJS) wadpy.o -o libwadpy.so $(LIBS)
cp libwadpy.so ..
tcl::
cc -c $(INCLUDE) $(SRCS)
cc -c $(OPT) $(INCLUDE) $(SRCS)
CC -Kpic -c $(INCLUDE) $(TCLINCLUDE) wadtcl.cxx
CC -G $(OBJS) wadtcl.o -o wad.so
CC -G $(OBJS) wadtcl.o -o wad.so $(LIBS)
cp wad.so libwadtcl.so
cp libwadtcl.so ..

View file

@ -0,0 +1,19 @@
/* -----------------------------------------------------------------------------
* demangle.c
*
* This file performs C++ partial name demangling to the extent that it
* seems reasonable.
*
* Author(s) : David Beazley (beazley@cs.uchicago.edu)
*
* Copyright (C) 2000. The University of Chicago
* See the file LICENSE for information on usage and redistribution.
* ----------------------------------------------------------------------------- */
#include "wad.h"
char *wad_cplus_demangle(WadSymbol *ws) {
static char buffer[4096];
strcpy(buffer,ws->name);
return buffer;
}

View file

@ -233,7 +233,6 @@ wad_elf_find_symbol(WadObjectFile *wo, void *ptr, unsigned long base, WadSymbol
if (ELF32_ST_TYPE(sym[i].st_info) == STT_FILE) {
localfile = name;
}
/* printf("%s %x\n", name, sym[i].st_value); */
if (((base + sym[i].st_value) <= vaddr) && (vaddr < (base+sym[i].st_value + sym[i].st_size))) {
ws->value = sym[i].st_value;
if (ELF32_ST_BIND(sym[i].st_info) == STB_LOCAL) {

View file

@ -41,6 +41,12 @@ void wad_init() {
if (getenv("WAD_DEBUG_STABS")) {
wad_debug_mode |= DEBUG_STABS;
}
if (getenv("WAD_DEBUG_RETURN")) {
wad_debug_mode |= DEBUG_RETURN;
}
#ifndef WAD_LINUX
if (!init) {
wad_signal_init();

View file

@ -11,89 +11,34 @@
* See the file LICENSE for information on usage and redistribution.
* ----------------------------------------------------------------------------- */
WadSegment *
wad_segment_read() {
int fd;
static FILE *
segment_open() {
FILE *f;
f = fopen("/proc/self/map", "r");
return f;
}
static int
segment_read(FILE *fs, WadSegment *s) {
int dz;
int offset = 0;
int i;
int n = 0;
int nsegments;
WadSegment *segments;
WadSegment *s;
int n;
prmap_t pmap;
/* Try to load the virtual address map */
fd = open("/proc/self/map", O_RDONLY);
if (fd < 0) {
return 0;
}
nsegments = 0;
while (1) {
n = read(fd,&pmap,sizeof(prmap_t));
if (n <= 0) break;
nsegments++;
}
nsegments+=3;
close(fd);
n = fread(&pmap, sizeof(prmap_t), 1, fs);
if (n <= 0) return 0;
strncpy(s->mapname, pmap.pr_mapname, MAX_PATH);
strcpy(s->mappath,"/proc/self/object/");
strcat(s->mappath,pmap.pr_mapname);
s->vaddr = (char *) pmap.pr_vaddr;
dz = open("/dev/zero", O_RDWR, 0644);
if (dz < 0) {
puts("Couldn't open /dev/zero\n");
return 0;
}
segments = (WadSegment *) mmap(NULL, nsegments*sizeof(WadSegment), PROT_READ | PROT_WRITE, MAP_PRIVATE, dz, 0);
close(dz);
fd = open("/proc/self/map", O_RDONLY);
if (fd < 0) return;
i = 0;
s = segments;
/* This is a solaris oddity. a.out section starts 1 page up, but
symbols are relative to a base of 0 */
/* First segment is a map to the segment list */
s->base = (char *) segments;
s->vaddr = (char *) segments;
s->size = nsegments*sizeof(WadSegment);
s->mapname[0] = 0;
s->mappath[0] = 0;
s++;
if (strcmp(s->mapname,"a.out") == 0) s->base = 0;
else s->base = s->vaddr;
while (1) {
n = read(fd,&pmap,sizeof(prmap_t));
if (n <= 0) break;
strncpy(s->mapname, pmap.pr_mapname, MAX_PATH);
strcpy(s->mappath,"/proc/self/object/");
strcat(s->mappath,pmap.pr_mapname);
s->vaddr = (char *) pmap.pr_vaddr;
/* This is a solaris oddity. a.out section starts 1 page up, but
symbols are relative to a base of 0 */
if (strcmp(s->mapname,"a.out") == 0) s->base = 0;
else s->base = s->vaddr;
s->size = pmap.pr_size;
s->offset = pmap.pr_offset;
s++;
}
/* Create sentinel */
s->base = 0;
s->vaddr = 0;
s->size = 0;
s->offset = 0;
s->mapname[0] =0;
s->mappath[0] = 0;
close(fd);
return segments;
}
/* -----------------------------------------------------------------------------
* wad_segment_release()
*
* This function releases all of the segments.
* ----------------------------------------------------------------------------- */
void
wad_segment_release(WadSegment *s) {
munmap((void *)s, s->size);
s->size = pmap.pr_size;
s->offset = pmap.pr_offset;
return 1;
}

View file

@ -0,0 +1,50 @@
/* -----------------------------------------------------------------------------
* return.c
*
* This file manages the set of return-points for the WAD signal handler.
*
* Author(s) : David Beazley (beazley@cs.uchicago.edu)
*
* Copyright (C) 2000. The University of Chicago
* See the file LICENSE for information on usage and redistribution.
* ----------------------------------------------------------------------------- */
#include "wad.h"
/* Maximum number of return points */
#define WAD_NUMBER_RETURN 128
static WadReturnFunc return_points[WAD_NUMBER_RETURN];
static int num_return = 0;
void wad_set_return(const char *name, long value) {
WadReturnFunc *rp;
rp = &return_points[num_return];
strcpy(rp->name,name);
rp->value = value;
num_return++;
if (wad_debug_mode & DEBUG_RETURN) {
printf("wad: Setting return ('%s', %d)\n", name,value);
}
}
void wad_set_returns(WadReturnFunc *rf) {
int i;
while (strlen(rf[i].name)) {
wad_set_return(rf[i].name, rf[i].value);
i++;
}
}
WadReturnFunc *wad_check_return(const char *name) {
int i;
for (i = 0; i < num_return; i++) {
if (strcmp(name,return_points[i].name) == 0) {
if (wad_debug_mode & DEBUG_RETURN) {
printf("wad: Found return ('%s', %d)\n", return_points[i].name, return_points[i].value);
}
return &return_points[i];
}
}
return 0;
}

View file

@ -15,33 +15,6 @@
#define STACK_SIZE 4*SIGSTKSZ
char wad_sig_stack[STACK_SIZE];
/* Data structures for containing information about non-local returns */
typedef struct nonlocal {
char symname[256];
long value;
struct nonlocal *next;
} nonlocal;
static nonlocal *return_points = 0;
void wad_set_return(const char *name, long value) {
nonlocal *nl;
nl = (nonlocal *) malloc(sizeof(nonlocal));
strcpy(nl->symname,name);
nl->value = value;
nl->next = return_points;
return_points = nl;
}
void wad_set_returns(WadReturnFunc *rf) {
int i;
while (rf[i].name) {
wad_set_return(rf[i].name, rf[i].value);
i++;
}
}
static void (*sig_callback)(int signo, WadFrame *data, char *ret) = 0;
void wad_set_callback(void (*s)(int,WadFrame *,char *ret)) {
@ -132,16 +105,11 @@ void wad_signalhandler(int sig, siginfo_t *si, void *vcontext) {
framedata = (char *) frame;
while (frame->size) {
nonlocal *nl = return_points;
nl = return_points;
while (nl) {
if (strcmp(framedata + frame->sym_off,nl->symname) == 0) {
found = 1;
nlr_value = nl->value;
retname = nl->symname;
break;
}
nl = nl->next;
WadReturnFunc *wr = wad_check_return(framedata+frame->sym_off);
if (wr) {
found = 1;
nlr_value = wr->value;
retname = wr->name;
}
framedata = framedata + frame->size;
frame = (WadFrame *) framedata;
@ -186,7 +154,7 @@ void wad_signalhandler(int sig, siginfo_t *si, void *vcontext) {
/* -----------------------------------------------------------------------------
* wad_signal_init()
*
* Reset the signal handler.
* Resets the signal handler.
* ----------------------------------------------------------------------------- */
void wad_signal_init() {

View file

@ -100,6 +100,9 @@ wad_stack_trace(unsigned long pc, unsigned long sp, unsigned long fp) {
} else {
symname = 0;
}
if (symname) symname = wad_cplus_demangle(&wsym);
value = wsym.value;
/* Build up some information about the exception frame */
@ -114,6 +117,8 @@ wad_stack_trace(unsigned long pc, unsigned long sp, unsigned long fp) {
if (symname) {
symsize = strlen(symname)+1;
/* printf("C++: '%s' ---> '%s'\n", symname, wad_cplus_demangle(&wsym));*/
/* Try to gather some debugging information about this symbol */
if (wad_debug_info(wo,&wsym, p_pc - (unsigned long) ws->base - value, &wd)) {
srcname = wd.srcfile;

View file

@ -91,7 +91,7 @@ static WadReturnFunc retpts[] = {
{"PyMapping_Length", -1},
{"PyMapping_SetItemString", -1},
{"PyMapping_Values", 0},
{0,0}};
{"",0}};
/* Handler function */
static void handler(int signo, WadFrame *frame, char *ret) {