Julian Elischer wrote: > mprof is a memory allocation profiler. > > as part of what it does it reads the stack for a call graph. > > it finds the current frame pointer from the address of a variable on > the stack > and then from that traces back to previous return addresses. > > however there is a catch, at least on i386.. > > with -O2 the variable is 4 bytes below the fp and > without it it is 12 bytes below. > so it has to know how it was compiled to get it right. > > in addition, with -O2 it seems that the address of the variable > may actually be wring if the optimiser never bothers to > have the variable actually saved. > > > one possibility would be to use #asm to just give the value of %ebp but I don't know how to do that.. > > currently it does: > > > > findretaddr() > { > int first_var; > u_int *fp > u_int *retptr > > > fp = ((char *)(&first_var)) + 4; /* needs to be 12 if no -O2 */ > retptr = ((char *)fp) + 4; > prev_fp = *fp; > > [...] > > > } > > Anyone with ideas as to how to make the port act reliably? > > mprof is really cool but thos probelm makes it hard to use. > you have ot make sure you compile the library itself without -O > and change the code.. > > why it needs to be 12 is unknown the compiler seems to want > to push extra regs before savinghte frame pointer. here's a littel test program that demonsteates how good mprof is (when it works) however if you compile mprof with O2 as it is by default I think, it just crashes. no -O allows it to work but you have to fix the 4 to 12 in the mprof_???.h file. this seems a bit less tham 'predictable' #include <stdio.h> #include <stdlib.h> typedef struct A { char c[300]; } A; void foo2() { void * ptr = malloc(1024); *(char *)ptr = 'a'; } void foo1() { void * ptr = malloc(1024); struct A *p = malloc(sizeof(struct A)); p->c[0] = 'b'; *(char *)ptr = 'a'; foo2(); } void foo() { int first_local; first_local=10; void * ptr = malloc(1024); *(char *)ptr = 'a'; foo1(); foo2(); } int main(int argc, char**argv) { void *ptr = malloc(1024); free(ptr); foo(); foo2(); return(0); } > > > > > _______________________________________________ > freebsd-current_at_freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-current > To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"Received on Sat Jun 14 2008 - 06:10:46 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:31 UTC