<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>