Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: base/trace_event/heap_profiler_allocation_context_tracker.cc

Issue 1975393002: Check stack pointer to be inside stack when unwinding. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix renderer deadlock on Linux Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/trace_event/heap_profiler_allocation_context_tracker.h" 5 #include "base/trace_event/heap_profiler_allocation_context_tracker.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <iterator> 8 #include <iterator>
9 9
10 #include "base/atomicops.h" 10 #include "base/atomicops.h"
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 AllocationContext AllocationContextTracker::GetContextSnapshot() { 158 AllocationContext AllocationContextTracker::GetContextSnapshot() {
159 AllocationContext ctx; 159 AllocationContext ctx;
160 160
161 if (ignore_scope_depth_) { 161 if (ignore_scope_depth_) {
162 ctx.backtrace.frames[0] = StackFrame::FromTraceEventName(kTracingOverhead); 162 ctx.backtrace.frames[0] = StackFrame::FromTraceEventName(kTracingOverhead);
163 ctx.type_name = kTracingOverhead; 163 ctx.type_name = kTracingOverhead;
164 ctx.backtrace.frame_count = 1; 164 ctx.backtrace.frame_count = 1;
165 return ctx; 165 return ctx;
166 } 166 }
167 167
168 // Ignore reentrancy during the call.
169 ignore_scope_depth_++;
170
168 CaptureMode mode = static_cast<CaptureMode>( 171 CaptureMode mode = static_cast<CaptureMode>(
169 subtle::NoBarrier_Load(&capture_mode_)); 172 subtle::NoBarrier_Load(&capture_mode_));
170 173
171 auto backtrace = std::begin(ctx.backtrace.frames); 174 auto backtrace = std::begin(ctx.backtrace.frames);
172 auto backtrace_end = std::end(ctx.backtrace.frames); 175 auto backtrace_end = std::end(ctx.backtrace.frames);
173 176
174 if (!thread_name_) { 177 if (!thread_name_) {
175 // Ignore the string allocation made by GetAndLeakThreadName to avoid
176 // reentrancy.
177 ignore_scope_depth_++;
178 thread_name_ = GetAndLeakThreadName(); 178 thread_name_ = GetAndLeakThreadName();
179 ANNOTATE_LEAKING_OBJECT_PTR(thread_name_); 179 ANNOTATE_LEAKING_OBJECT_PTR(thread_name_);
180 DCHECK(thread_name_); 180 DCHECK(thread_name_);
181 ignore_scope_depth_--;
182 } 181 }
183 182
184 // Add the thread name as the first entry in pseudo stack. 183 // Add the thread name as the first entry in pseudo stack.
185 if (thread_name_) { 184 if (thread_name_) {
186 *backtrace++ = StackFrame::FromThreadName(thread_name_); 185 *backtrace++ = StackFrame::FromThreadName(thread_name_);
187 } 186 }
188 187
189 switch (mode) { 188 switch (mode) {
190 case CaptureMode::DISABLED: 189 case CaptureMode::DISABLED:
191 { 190 {
(...skipping 11 matching lines...) Expand all
203 } 202 }
204 case CaptureMode::NATIVE_STACK: 203 case CaptureMode::NATIVE_STACK:
205 { 204 {
206 // Backtrace contract requires us to return bottom frames, i.e. 205 // Backtrace contract requires us to return bottom frames, i.e.
207 // from main() and up. Stack unwinding produces top frames, i.e. 206 // from main() and up. Stack unwinding produces top frames, i.e.
208 // from this point and up until main(). We request many frames to 207 // from this point and up until main(). We request many frames to
209 // make sure we reach main(), and then copy bottom portion of them. 208 // make sure we reach main(), and then copy bottom portion of them.
210 const void* frames[128]; 209 const void* frames[128];
211 static_assert(arraysize(frames) >= Backtrace::kMaxFrameCount, 210 static_assert(arraysize(frames) >= Backtrace::kMaxFrameCount,
212 "not requesting enough frames to fill Backtrace"); 211 "not requesting enough frames to fill Backtrace");
213 #if HAVE_TRACE_STACK_FRAME_POINTERS && !defined(OS_NACL) 212 #if HAVE_TRACE_STACK_FRAME_POINTERS && !defined(OS_NACL)
Primiano Tucci (use gerrit) 2016/05/27 16:49:43 tip: maybe exclude OS_NACL in HAVE_TRACE_STACK_FRA
Dmitry Skiba 2016/05/27 18:50:09 OS_NACL is there because in NaCl mode stack_trace.
Primiano Tucci (use gerrit) 2016/05/31 16:13:06 Yeah but since we generally don't care about what
214 size_t frame_count = debug::TraceStackFramePointers( 213 size_t frame_count = debug::TraceStackFramePointers(
215 frames, 214 frames,
216 arraysize(frames), 215 arraysize(frames),
217 1 /* exclude this function from the trace */ ); 216 1 /* exclude this function from the trace */,
217 &stack_info_);
218 #else 218 #else
219 size_t frame_count = 0; 219 size_t frame_count = 0;
220 NOTREACHED(); 220 NOTREACHED();
221 #endif 221 #endif
222 222
223 // Copy frames backwards 223 // Copy frames backwards
224 size_t backtrace_capacity = backtrace_end - backtrace; 224 size_t backtrace_capacity = backtrace_end - backtrace;
225 size_t top_frame_index = (backtrace_capacity >= frame_count) ? 225 size_t top_frame_index = (backtrace_capacity >= frame_count) ?
226 0 : 226 0 :
227 frame_count - backtrace_capacity; 227 frame_count - backtrace_capacity;
228 for (size_t i = frame_count; i > top_frame_index;) { 228 for (size_t i = frame_count; i > top_frame_index;) {
229 const void* frame = frames[--i]; 229 const void* frame = frames[--i];
230 *backtrace++ = StackFrame::FromProgramCounter(frame); 230 *backtrace++ = StackFrame::FromProgramCounter(frame);
231 } 231 }
232 break; 232 break;
233 } 233 }
234 } 234 }
235 235
236 ctx.backtrace.frame_count = backtrace - std::begin(ctx.backtrace.frames); 236 ctx.backtrace.frame_count = backtrace - std::begin(ctx.backtrace.frames);
237 237
238 // TODO(ssid): Fix crbug.com/594803 to add file name as 3rd dimension 238 // TODO(ssid): Fix crbug.com/594803 to add file name as 3rd dimension
239 // (component name) in the heap profiler and not piggy back on the type name. 239 // (component name) in the heap profiler and not piggy back on the type name.
240 ctx.type_name = task_contexts_.empty() ? nullptr : task_contexts_.back(); 240 ctx.type_name = task_contexts_.empty() ? nullptr : task_contexts_.back();
241 241
242 ignore_scope_depth_--;
242 return ctx; 243 return ctx;
243 } 244 }
244 245
245 } // namespace trace_event 246 } // namespace trace_event
246 } // namespace base 247 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698