Chromium Code Reviews| Index: runtime/vm/profiler.cc |
| diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc |
| index a4e12927e3fd6818125d05c8f046e3070742c807..e3e029e1e3b6ff07f8a2f7400efe4c6867b39cce 100644 |
| --- a/runtime/vm/profiler.cc |
| +++ b/runtime/vm/profiler.cc |
| @@ -224,31 +224,45 @@ void Profiler::PrintToJSONStream(Isolate* isolate, JSONStream* stream) { |
| } |
| -static char* FindSymbolName(uintptr_t pc, bool* native_symbol) { |
| +static char* FindSymbolName(uintptr_t pc, bool* symbol_name_allocated) { |
| // TODO(johnmccutchan): Differentiate between symbols which can't be found |
| // and symbols which were GCed. (Heap::CodeContains). |
| - ASSERT(native_symbol != NULL); |
| + ASSERT(symbol_name_allocated != NULL); |
| const char* symbol_name = "Unknown"; |
| - *native_symbol = false; |
| + *symbol_name_allocated = false; |
| if (pc == 0) { |
| return const_cast<char*>(Sample::kNoFrame); |
| } |
| const Code& code = Code::Handle(Code::LookupCode(pc)); |
| - if (code.IsNull()) { |
| - // Possibly a native symbol. |
| - char* native_name = NativeSymbolResolver::LookupSymbolName(pc); |
| - if (native_name != NULL) { |
| - symbol_name = native_name; |
| - *native_symbol = true; |
| - } |
| - } else { |
| + if (!code.IsNull()) { |
| const Function& function = Function::Handle(code.function()); |
| if (!function.IsNull()) { |
| const String& name = String::Handle(function.QualifiedUserVisibleName()); |
| if (!name.IsNull()) { |
| symbol_name = name.ToCString(); |
| + return const_cast<char*>(symbol_name); |
| } |
| } |
| + } else { |
| + // Possibly a native symbol. |
| + char* native_name = NativeSymbolResolver::LookupSymbolName(pc); |
| + if (native_name != NULL) { |
| + symbol_name = native_name; |
| + *symbol_name_allocated = true; |
| + return const_cast<char*>(symbol_name); |
| + } |
| + } |
| + const intptr_t kBucketSize = 256; |
| + const intptr_t kBucketMask = ~(kBucketSize - 1); |
| + // Not a Dart symbol or a native symbol. Bin into buckets by PC. |
| + pc &= kBucketMask; |
| + { |
| + const intptr_t kBuffSize = 256; |
| + char buff[kBuffSize]; |
|
Ivan Posva
2013/12/19 00:10:10
Ah!
|
| + OS::SNPrint(&buff[0], kBuffSize-1, "Unknown [%" Px ", %" Px ")", |
| + pc, pc + kBucketSize); |
| + symbol_name = strdup(buff); |
| + *symbol_name_allocated = true; |
| } |
| return const_cast<char*>(symbol_name); |
| } |
| @@ -282,8 +296,9 @@ void Profiler::WriteTracingSample(Isolate* isolate, intptr_t pid, |
| case Sample::kIsolateSample: |
| // Write "B" events. |
| for (int i = Sample::kNumStackFrames - 1; i >= 0; i--) { |
| - bool native_symbol = false; |
| - char* symbol_name = FindSymbolName(sample->pcs[i], &native_symbol); |
| + bool symbol_name_allocated = false; |
| + char* symbol_name = FindSymbolName(sample->pcs[i], |
| + &symbol_name_allocated); |
| { |
| JSONObject begin(&events); |
| begin.AddProperty("ph", "B"); |
| @@ -292,8 +307,8 @@ void Profiler::WriteTracingSample(Isolate* isolate, intptr_t pid, |
| begin.AddProperty("name", symbol_name); |
| begin.AddProperty("ts", timestamp); |
| } |
| - if (native_symbol) { |
| - NativeSymbolResolver::FreeSymbolName(symbol_name); |
| + if (symbol_name_allocated) { |
| + free(symbol_name); |
| } |
| } |
| // Write "E" events. |