1
0
mirror of https://github.com/golang/go synced 2024-11-24 01:30:10 -07:00

runtime: emit collection stacks in GODEBUG=allocfreetrace mode

R=khr, dvyukov
CC=golang-codereviews
https://golang.org/cl/51830043
This commit is contained in:
Russ Cox 2014-01-14 10:39:50 -05:00
parent e0dcf73d61
commit 3ec60c253d
3 changed files with 20 additions and 4 deletions

View File

@ -521,6 +521,7 @@ enum
void runtime·MProf_Malloc(void*, uintptr, uintptr);
void runtime·MProf_Free(Bucket*, void*, uintptr);
void runtime·MProf_GC(void);
void runtime·MProf_TraceGC(void);
int32 runtime·gcprocs(void);
void runtime·helpgc(int32 nproc);
void runtime·gchelper(void);

View File

@ -2163,6 +2163,9 @@ runtime·gc(int32 force)
a.start_time = runtime·nanotime();
m->gcing = 1;
runtime·stoptheworld();
if(runtime·debug.allocfreetrace)
runtime·MProf_TraceGC();
clearpools();

View File

@ -173,6 +173,18 @@ printstackframes(uintptr *stk, int32 nstk)
}
}
// Called by collector to report a gc in allocfreetrace mode.
void
runtime·MProf_TraceGC(void)
{
uintptr stk[32];
int32 nstk;
nstk = runtime·callers(1, stk, nelem(stk));
runtime·printf("MProf_TraceGC\n");
printstackframes(stk, nstk);
}
// Called by malloc to record a profiled block.
void
runtime·MProf_Malloc(void *p, uintptr size, uintptr typ)
@ -183,14 +195,14 @@ runtime·MProf_Malloc(void *p, uintptr size, uintptr typ)
int8 *name;
int32 nstk;
nstk = runtime·callers(1, stk, 32);
nstk = runtime·callers(1, stk, nelem(stk));
runtime·lock(&proflock);
if(runtime·debug.allocfreetrace) {
if(runtime·debug.allocfreetrace) {
type = (Type*)(typ & ~3);
name = typeinfoname(typ & 3);
runtime·printf("MProf_Malloc(p=%p, size=%p, type=%p <%s", p, size, type, name);
if(type != nil)
runtime·printf(" of %S", *type->string);
runtime·printf(" of %S", *type->string);
runtime·printf(">)\n");
printstackframes(stk, nstk);
}
@ -247,7 +259,7 @@ runtime·blockevent(int64 cycles, int32 skip)
if(rate <= 0 || (rate > cycles && runtime·fastrand1()%rate > cycles))
return;
nstk = runtime·callers(skip, stk, 32);
nstk = runtime·callers(skip, stk, nelem(stk));
runtime·lock(&proflock);
b = stkbucket(BProf, stk, nstk, true);
b->count++;