Commit 3ec60c25 authored by Russ Cox's avatar Russ Cox

runtime: emit collection stacks in GODEBUG=allocfreetrace mode

R=khr, dvyukov
CC=golang-codereviews
https://golang.org/cl/51830043
parent e0dcf73d
...@@ -521,6 +521,7 @@ enum ...@@ -521,6 +521,7 @@ enum
void runtime·MProf_Malloc(void*, uintptr, uintptr); void runtime·MProf_Malloc(void*, uintptr, uintptr);
void runtime·MProf_Free(Bucket*, void*, uintptr); void runtime·MProf_Free(Bucket*, void*, uintptr);
void runtime·MProf_GC(void); void runtime·MProf_GC(void);
void runtime·MProf_TraceGC(void);
int32 runtime·gcprocs(void); int32 runtime·gcprocs(void);
void runtime·helpgc(int32 nproc); void runtime·helpgc(int32 nproc);
void runtime·gchelper(void); void runtime·gchelper(void);
......
...@@ -2163,6 +2163,9 @@ runtime·gc(int32 force) ...@@ -2163,6 +2163,9 @@ runtime·gc(int32 force)
a.start_time = runtime·nanotime(); a.start_time = runtime·nanotime();
m->gcing = 1; m->gcing = 1;
runtime·stoptheworld(); runtime·stoptheworld();
if(runtime·debug.allocfreetrace)
runtime·MProf_TraceGC();
clearpools(); clearpools();
......
...@@ -173,6 +173,18 @@ printstackframes(uintptr *stk, int32 nstk) ...@@ -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. // Called by malloc to record a profiled block.
void void
runtime·MProf_Malloc(void *p, uintptr size, uintptr typ) runtime·MProf_Malloc(void *p, uintptr size, uintptr typ)
...@@ -183,14 +195,14 @@ runtime·MProf_Malloc(void *p, uintptr size, uintptr typ) ...@@ -183,14 +195,14 @@ runtime·MProf_Malloc(void *p, uintptr size, uintptr typ)
int8 *name; int8 *name;
int32 nstk; int32 nstk;
nstk = runtime·callers(1, stk, 32); nstk = runtime·callers(1, stk, nelem(stk));
runtime·lock(&proflock); runtime·lock(&proflock);
if(runtime·debug.allocfreetrace) { if(runtime·debug.allocfreetrace) {
type = (Type*)(typ & ~3); type = (Type*)(typ & ~3);
name = typeinfoname(typ & 3); name = typeinfoname(typ & 3);
runtime·printf("MProf_Malloc(p=%p, size=%p, type=%p <%s", p, size, type, name); runtime·printf("MProf_Malloc(p=%p, size=%p, type=%p <%s", p, size, type, name);
if(type != nil) if(type != nil)
runtime·printf(" of %S", *type->string); runtime·printf(" of %S", *type->string);
runtime·printf(">)\n"); runtime·printf(">)\n");
printstackframes(stk, nstk); printstackframes(stk, nstk);
} }
...@@ -247,7 +259,7 @@ runtime·blockevent(int64 cycles, int32 skip) ...@@ -247,7 +259,7 @@ runtime·blockevent(int64 cycles, int32 skip)
if(rate <= 0 || (rate > cycles && runtime·fastrand1()%rate > cycles)) if(rate <= 0 || (rate > cycles && runtime·fastrand1()%rate > cycles))
return; return;
nstk = runtime·callers(skip, stk, 32); nstk = runtime·callers(skip, stk, nelem(stk));
runtime·lock(&proflock); runtime·lock(&proflock);
b = stkbucket(BProf, stk, nstk, true); b = stkbucket(BProf, stk, nstk, true);
b->count++; b->count++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment