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

Side by Side Diff: runtime/vm/profiler.cc

Issue 2771293003: Resubmission of native memory allocation info surfacing in Observatory. Fixed crashing tests and st… (Closed)
Patch Set: Added page to Observatory to display native memory allocation information. Created 3 years, 8 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
« no previous file with comments | « runtime/vm/profiler.h ('k') | runtime/vm/profiler_service.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "platform/address_sanitizer.h" 5 #include "platform/address_sanitizer.h"
6 #include "platform/memory_sanitizer.h" 6 #include "platform/memory_sanitizer.h"
7 #include "platform/utils.h" 7 #include "platform/utils.h"
8 8
9 #include "vm/allocation.h" 9 #include "vm/allocation.h"
10 #include "vm/atomic.h" 10 #include "vm/atomic.h"
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 return true; 309 return true;
310 } 310 }
311 const int64_t timestamp = sample->timestamp(); 311 const int64_t timestamp = sample->timestamp();
312 int64_t delta = timestamp - time_origin_micros_; 312 int64_t delta = timestamp - time_origin_micros_;
313 return (delta >= 0) && (delta <= time_extent_micros_); 313 return (delta >= 0) && (delta <= time_extent_micros_);
314 } 314 }
315 315
316 316
317 bool SampleFilter::TaskFilterSample(Sample* sample) { 317 bool SampleFilter::TaskFilterSample(Sample* sample) {
318 const intptr_t task = static_cast<intptr_t>(sample->thread_task()); 318 const intptr_t task = static_cast<intptr_t>(sample->thread_task());
319 if (thread_task_mask_ == kNoTaskFilter) {
320 return true;
321 }
319 return (task & thread_task_mask_) != 0; 322 return (task & thread_task_mask_) != 0;
320 } 323 }
321 324
322 325
323 ClearProfileVisitor::ClearProfileVisitor(Isolate* isolate) 326 ClearProfileVisitor::ClearProfileVisitor(Isolate* isolate)
324 : SampleVisitor(isolate->main_port()) {} 327 : SampleVisitor(isolate->main_port()) {}
325 328
326 329
327 void ClearProfileVisitor::VisitSample(Sample* sample) { 330 void ClearProfileVisitor::VisitSample(Sample* sample) {
328 sample->Clear(); 331 sample->Clear();
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 sample->set_user_tag(isolate->user_tag()); 934 sample->set_user_tag(isolate->user_tag());
932 sample->set_thread_task(thread->task_kind()); 935 sample->set_thread_task(thread->task_kind());
933 return sample; 936 return sample;
934 } 937 }
935 938
936 939
937 static Sample* SetupSampleNative(SampleBuffer* sample_buffer, ThreadId tid) { 940 static Sample* SetupSampleNative(SampleBuffer* sample_buffer, ThreadId tid) {
938 Sample* sample = sample_buffer->ReserveSample(); 941 Sample* sample = sample_buffer->ReserveSample();
939 sample->Init(ILLEGAL_PORT, OS::GetCurrentMonotonicMicros(), tid); 942 sample->Init(ILLEGAL_PORT, OS::GetCurrentMonotonicMicros(), tid);
940 sample->set_is_native_allocation_sample(true); 943 sample->set_is_native_allocation_sample(true);
941
942 Thread* thread = Thread::Current(); 944 Thread* thread = Thread::Current();
943 945
944 // TODO(bkonyi) Any samples created while a current thread doesn't exist are 946 // Note: setting thread task in order to be consistent with other samples. The
945 // ignored by the NativeAllocationSampleFilter since the default task is 947 // task kind is not used by NativeAllocationSampleFilter for filtering
946 // kUnknownTask. Is this what we want to do? 948 // purposes as some samples may be collected when no thread exists.
947 if (thread != NULL) { 949 if (thread != NULL) {
948 sample->set_thread_task(thread->task_kind()); 950 sample->set_thread_task(thread->task_kind());
949 } 951 }
950 return sample; 952 return sample;
951 } 953 }
952 954
953 955
954 static bool CheckIsolate(Isolate* isolate) { 956 static bool CheckIsolate(Isolate* isolate) {
955 if ((isolate == NULL) || (Dart::vm_isolate() == NULL)) { 957 if ((isolate == NULL) || (Dart::vm_isolate() == NULL)) {
956 // No isolate. 958 // No isolate.
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1085 } else { 1087 } else {
1086 // Fall back. 1088 // Fall back.
1087 uintptr_t pc = OS::GetProgramCounter(); 1089 uintptr_t pc = OS::GetProgramCounter();
1088 Sample* sample = SetupSample(thread, sample_buffer, os_thread->trace_id()); 1090 Sample* sample = SetupSample(thread, sample_buffer, os_thread->trace_id());
1089 sample->SetAllocationCid(cid); 1091 sample->SetAllocationCid(cid);
1090 sample->SetAt(0, pc); 1092 sample->SetAt(0, pc);
1091 } 1093 }
1092 } 1094 }
1093 1095
1094 1096
1095 Sample* Profiler::SampleNativeAllocation(intptr_t skip_count) { 1097 Sample* Profiler::SampleNativeAllocation(intptr_t skip_count,
1098 uword address,
1099 uintptr_t allocation_size) {
1096 SampleBuffer* sample_buffer = Profiler::sample_buffer(); 1100 SampleBuffer* sample_buffer = Profiler::sample_buffer();
1097 if (sample_buffer == NULL) { 1101 if (sample_buffer == NULL) {
1098 return NULL; 1102 return NULL;
1099 } 1103 }
1100 1104
1101 uintptr_t sp = Thread::GetCurrentStackPointer(); 1105 uintptr_t sp = Thread::GetCurrentStackPointer();
1102 uintptr_t fp = 0; 1106 uintptr_t fp = 0;
1103 uintptr_t pc = OS::GetProgramCounter(); 1107 uintptr_t pc = OS::GetProgramCounter();
1104 1108
1105 COPY_FP_REGISTER(fp); 1109 COPY_FP_REGISTER(fp);
1106 1110
1107 uword stack_lower = 0; 1111 uword stack_lower = 0;
1108 uword stack_upper = 0; 1112 uword stack_upper = 0;
1109 if (!InitialRegisterCheck(pc, fp, sp)) { 1113 if (!InitialRegisterCheck(pc, fp, sp)) {
1110 AtomicOperations::IncrementInt64By( 1114 AtomicOperations::IncrementInt64By(
1111 &counters_.failure_native_allocation_sample, 1); 1115 &counters_.failure_native_allocation_sample, 1);
1112 return NULL; 1116 return NULL;
1113 } 1117 }
1114 1118
1115 if (!(OSThread::GetCurrentStackBounds(&stack_lower, &stack_upper) && 1119 if (!(OSThread::GetCurrentStackBounds(&stack_lower, &stack_upper) &&
1116 ValidateThreadStackBounds(fp, sp, stack_lower, stack_upper))) { 1120 ValidateThreadStackBounds(fp, sp, stack_lower, stack_upper))) {
1117 // Could not get stack boundary. 1121 // Could not get stack boundary.
1118 AtomicOperations::IncrementInt64By( 1122 AtomicOperations::IncrementInt64By(
1119 &counters_.failure_native_allocation_sample, 1); 1123 &counters_.failure_native_allocation_sample, 1);
1120 return NULL; 1124 return NULL;
1121 } 1125 }
1122 1126
1123 OSThread* os_thread = OSThread::Current(); 1127 OSThread* os_thread = OSThread::Current();
1124 Sample* sample = SetupSampleNative(sample_buffer, os_thread->trace_id()); 1128 Sample* sample = SetupSampleNative(sample_buffer, os_thread->trace_id());
1129 sample->set_native_allocation_address(address);
1130 sample->set_native_allocation_size_bytes(allocation_size);
1131
1125 ProfilerNativeStackWalker native_stack_walker( 1132 ProfilerNativeStackWalker native_stack_walker(
1126 ILLEGAL_PORT, sample, sample_buffer, stack_lower, stack_upper, pc, fp, sp, 1133 ILLEGAL_PORT, sample, sample_buffer, stack_lower, stack_upper, pc, fp, sp,
1127 skip_count); 1134 skip_count);
1135
1128 native_stack_walker.walk(); 1136 native_stack_walker.walk();
1129 return sample; 1137 return sample;
1130 } 1138 }
1131 1139
1132 1140
1133 void Profiler::SampleThreadSingleFrame(Thread* thread, uintptr_t pc) { 1141 void Profiler::SampleThreadSingleFrame(Thread* thread, uintptr_t pc) {
1134 ASSERT(thread != NULL); 1142 ASSERT(thread != NULL);
1135 OSThread* os_thread = thread->os_thread(); 1143 OSThread* os_thread = thread->os_thread();
1136 ASSERT(os_thread != NULL); 1144 ASSERT(os_thread != NULL);
1137 Isolate* isolate = thread->isolate(); 1145 Isolate* isolate = thread->isolate();
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
1450 1458
1451 ProcessedSample* SampleBuffer::BuildProcessedSample( 1459 ProcessedSample* SampleBuffer::BuildProcessedSample(
1452 Sample* sample, 1460 Sample* sample,
1453 const CodeLookupTable& clt) { 1461 const CodeLookupTable& clt) {
1454 Thread* thread = Thread::Current(); 1462 Thread* thread = Thread::Current();
1455 Zone* zone = thread->zone(); 1463 Zone* zone = thread->zone();
1456 1464
1457 ProcessedSample* processed_sample = new (zone) ProcessedSample(); 1465 ProcessedSample* processed_sample = new (zone) ProcessedSample();
1458 1466
1459 // Copy state bits from sample. 1467 // Copy state bits from sample.
1468 processed_sample->set_native_allocation_size_bytes(
1469 sample->native_allocation_size_bytes());
1460 processed_sample->set_timestamp(sample->timestamp()); 1470 processed_sample->set_timestamp(sample->timestamp());
1461 processed_sample->set_tid(sample->tid()); 1471 processed_sample->set_tid(sample->tid());
1462 processed_sample->set_vm_tag(sample->vm_tag()); 1472 processed_sample->set_vm_tag(sample->vm_tag());
1463 processed_sample->set_user_tag(sample->user_tag()); 1473 processed_sample->set_user_tag(sample->user_tag());
1464 if (sample->is_allocation_sample()) { 1474 if (sample->is_allocation_sample()) {
1465 processed_sample->set_allocation_cid(sample->allocation_cid()); 1475 processed_sample->set_allocation_cid(sample->allocation_cid());
1466 } 1476 }
1467 processed_sample->set_first_frame_executing(!sample->exit_frame_sample()); 1477 processed_sample->set_first_frame_executing(!sample->exit_frame_sample());
1468 1478
1469 // Copy stack trace from sample(s). 1479 // Copy stack trace from sample(s).
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1592 1602
1593 1603
1594 ProcessedSampleBuffer::ProcessedSampleBuffer() 1604 ProcessedSampleBuffer::ProcessedSampleBuffer()
1595 : code_lookup_table_(new CodeLookupTable(Thread::Current())) { 1605 : code_lookup_table_(new CodeLookupTable(Thread::Current())) {
1596 ASSERT(code_lookup_table_ != NULL); 1606 ASSERT(code_lookup_table_ != NULL);
1597 } 1607 }
1598 1608
1599 #endif // !PRODUCT 1609 #endif // !PRODUCT
1600 1610
1601 } // namespace dart 1611 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/profiler.h ('k') | runtime/vm/profiler_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698