<div dir="ltr"><div>Index: lib/asan/asan_thread.h</div><div>===================================================================</div><div>--- lib/asan/asan_thread.h<span class="" style="white-space:pre"> </span>(revision 190121)</div>
<div>+++ lib/asan/asan_thread.h<span class="" style="white-space:pre"> </span>(working copy)</div><div>@@ -36,10 +36,12 @@</div><div> explicit AsanThreadContext(int tid)</div><div> : ThreadContextBase(tid),</div><div>
announced(false),</div><div>+ stacktracing(false),</div><div> thread(0) {</div><div> internal_memset(&stack, 0, sizeof(stack));</div><div> }</div><div> bool announced;</div><div>+ bool stacktracing;</div>
<div> StackTrace stack;</div><div> AsanThread *thread;</div><div> </div><div>@@ -86,6 +88,12 @@</div><div> UnmapOrDie(fake_stack_, sizeof(FakeStack));</div><div> }</div><div> FakeStack *fake_stack() { return fake_stack_; }</div>
<div>+ bool isStacktracing() { </div><div>+ if (context()) {</div><div>+ return context()->stacktracing;</div><div>+ }</div><div>+ return false;</div><div>+ }</div><div> </div><div> AsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; }</div>
<div> AsanStats &stats() { return stats_; }</div><div>@@ -107,6 +115,24 @@</div><div> AsanStats stats_;</div><div> };</div><div> </div><div>+// AsanStacktracingSink is a sink for stacktracing member of a context</div>
<div>+class AsanStacktracingSink {</div><div>+ public:</div><div>+ AsanStacktracingSink(AsanThread * t)</div><div>+ : thread(t) {</div><div>+ if(t->context()) {</div><div>+ t->context()->stacktracing = true;</div>
<div>+ }</div><div>+ }</div><div>+ ~AsanStacktracingSink() {</div><div>+ if(thread->context()) {</div><div>+ thread->context()->stacktracing = false;</div><div>+ }</div><div>+ }</div>
<div>+ private:</div><div>+ AsanThread * thread;</div><div>+};</div><div>+</div><div> struct CreateThreadContextArgs {</div><div> AsanThread *thread;</div><div> StackTrace *stack;</div><div>Index: lib/asan/asan_stack.h</div>
<div>===================================================================</div><div>--- lib/asan/asan_stack.h<span class="" style="white-space:pre"> </span>(revision 190121)</div><div>+++ lib/asan/asan_stack.h<span class="" style="white-space:pre"> </span>(working copy)</div>
<div>@@ -36,14 +36,16 @@</div><div> #define GET_STACK_TRACE_WITH_PC_AND_BP(max_s, pc, bp, fast) \</div><div> StackTrace stack; \</div><div> { \</div>
<div>- uptr stack_top = 0, stack_bottom = 0; \</div><div> AsanThread *t; \</div><div>- if (asan_inited && (t = GetCurrentThread())) { \</div>
<div>- stack_top = t->stack_top(); \</div><div>- stack_bottom = t->stack_bottom(); \</div><div>+ stack.size = 0; \</div>
<div>+ if (asan_inited && (t = GetCurrentThread()) \</div><div>+ && !t->isStacktracing()) { \</div><div>+ uptr stack_top = t->stack_top(); \</div>
<div>+ uptr stack_bottom = t->stack_bottom(); \</div><div>+ AsanStacktracingSink sink(t); \</div><div>+ GetStackTrace(&stack, max_s, pc, bp, \</div>
<div>+ stack_top, stack_bottom, fast); \</div><div> } \</div><div>- GetStackTrace(&stack, max_s, pc, bp, \</div>
<div>- stack_top, stack_bottom, fast); \</div><div> }</div><div> #endif // SANITIZER_WINDOWS</div><div> </div></div>