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

Side by Side Diff: src/log.cc

Issue 546089: Fix issue 553: function frame is skipped in profile when compare stub is called. (Closed)
Patch Set: Introduced dedicated log event types, added stuff for DevTools Created 10 years, 11 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 | « src/log.h ('k') | src/mark-compact.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 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 return; 148 return;
149 } 149 }
150 150
151 const Address js_entry_sp = Top::js_entry_sp(Top::GetCurrentThread()); 151 const Address js_entry_sp = Top::js_entry_sp(Top::GetCurrentThread());
152 if (js_entry_sp == 0) { 152 if (js_entry_sp == 0) {
153 // Not executing JS now. 153 // Not executing JS now.
154 sample->frames_count = 0; 154 sample->frames_count = 0;
155 return; 155 return;
156 } 156 }
157 157
158 const Address functionAddr =
159 sample->fp + JavaScriptFrameConstants::kFunctionOffset;
160 if (SafeStackFrameIterator::IsWithinBounds(sample->sp, js_entry_sp,
161 functionAddr)) {
162 sample->function = Memory::Address_at(functionAddr) - kHeapObjectTag;
163 }
164
158 int i = 0; 165 int i = 0;
159 const Address callback = Logger::current_state_ != NULL ? 166 const Address callback = Logger::current_state_ != NULL ?
160 Logger::current_state_->external_callback() : NULL; 167 Logger::current_state_->external_callback() : NULL;
161 if (callback != NULL) { 168 if (callback != NULL) {
162 sample->stack[i++] = callback; 169 sample->stack[i++] = callback;
163 } 170 }
164 171
165 SafeStackTraceFrameIterator it( 172 SafeStackTraceFrameIterator it(sample->fp, sample->sp,
166 reinterpret_cast<Address>(sample->fp), 173 sample->sp, js_entry_sp);
167 reinterpret_cast<Address>(sample->sp),
168 reinterpret_cast<Address>(sample->sp),
169 js_entry_sp);
170 while (!it.done() && i < TickSample::kMaxFramesCount) { 174 while (!it.done() && i < TickSample::kMaxFramesCount) {
171 sample->stack[i++] = it.frame()->pc(); 175 sample->stack[i++] = it.frame()->pc();
172 it.Advance(); 176 it.Advance();
173 } 177 }
174 sample->frames_count = i; 178 sample->frames_count = i;
175 } 179 }
176 180
177 181
178 // 182 //
179 // Ticker used to provide ticks to the profiler and the sliding state 183 // Ticker used to provide ticks to the profiler and the sliding state
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 if (!compression_helper_->HandleMessage(&msg)) return; 834 if (!compression_helper_->HandleMessage(&msg)) return;
831 } 835 }
832 msg.Append('\n'); 836 msg.Append('\n');
833 msg.WriteToLogFile(); 837 msg.WriteToLogFile();
834 #endif 838 #endif
835 } 839 }
836 840
837 841
838 void Logger::CodeMoveEvent(Address from, Address to) { 842 void Logger::CodeMoveEvent(Address from, Address to) {
839 #ifdef ENABLE_LOGGING_AND_PROFILING 843 #ifdef ENABLE_LOGGING_AND_PROFILING
840 static Address prev_to_ = NULL; 844 MoveEventInternal(CODE_MOVE_EVENT, from, to);
841 if (!Log::IsEnabled() || !FLAG_log_code) return; 845 #endif
846 }
847
848
849 void Logger::CodeDeleteEvent(Address from) {
850 #ifdef ENABLE_LOGGING_AND_PROFILING
851 DeleteEventInternal(CODE_DELETE_EVENT, from);
852 #endif
853 }
854
855
856 void Logger::SnapshotPositionEvent(Address addr, int pos) {
857 #ifdef ENABLE_LOGGING_AND_PROFILING
858 if (!Log::IsEnabled() || !FLAG_log_snapshot_positions) return;
842 LogMessageBuilder msg; 859 LogMessageBuilder msg;
843 msg.Append("%s,", log_events_[CODE_MOVE_EVENT]); 860 msg.Append("%s,", log_events_[SNAPSHOT_POSITION_EVENT]);
844 msg.AppendAddress(from); 861 msg.AppendAddress(addr);
845 msg.Append(','); 862 msg.Append(",%d", pos);
846 msg.AppendAddress(to, prev_to_);
847 prev_to_ = to;
848 if (FLAG_compress_log) { 863 if (FLAG_compress_log) {
849 ASSERT(compression_helper_ != NULL); 864 ASSERT(compression_helper_ != NULL);
850 if (!compression_helper_->HandleMessage(&msg)) return; 865 if (!compression_helper_->HandleMessage(&msg)) return;
866 }
867 msg.Append('\n');
868 msg.WriteToLogFile();
869 #endif
870 }
871
872
873 void Logger::FunctionCreateEvent(JSFunction* function) {
874 #ifdef ENABLE_LOGGING_AND_PROFILING
875 static Address prev_code = NULL;
876 if (!Log::IsEnabled() || !FLAG_log_code) return;
877 LogMessageBuilder msg;
878 msg.Append("%s,", log_events_[FUNCTION_CREATION_EVENT]);
879 msg.AppendAddress(function->address());
880 msg.Append(',');
881 msg.AppendAddress(function->code()->address(), prev_code);
882 prev_code = function->code()->address();
883 if (FLAG_compress_log) {
884 ASSERT(compression_helper_ != NULL);
885 if (!compression_helper_->HandleMessage(&msg)) return;
851 } 886 }
852 msg.Append('\n'); 887 msg.Append('\n');
853 msg.WriteToLogFile(); 888 msg.WriteToLogFile();
854 #endif 889 #endif
855 } 890 }
856 891
857 892
858 void Logger::CodeDeleteEvent(Address from) { 893 void Logger::FunctionMoveEvent(Address from, Address to) {
859 #ifdef ENABLE_LOGGING_AND_PROFILING 894 #ifdef ENABLE_LOGGING_AND_PROFILING
895 MoveEventInternal(FUNCTION_MOVE_EVENT, from, to);
896 #endif
897 }
898
899
900 void Logger::FunctionDeleteEvent(Address from) {
901 #ifdef ENABLE_LOGGING_AND_PROFILING
902 DeleteEventInternal(FUNCTION_DELETE_EVENT, from);
903 #endif
904 }
905
906
907 void Logger::MoveEventInternal(LogEventsAndTags event,
908 Address from,
909 Address to) {
910 #ifdef ENABLE_LOGGING_AND_PROFILING
911 static Address prev_to_ = NULL;
860 if (!Log::IsEnabled() || !FLAG_log_code) return; 912 if (!Log::IsEnabled() || !FLAG_log_code) return;
861 LogMessageBuilder msg; 913 LogMessageBuilder msg;
862 msg.Append("%s,", log_events_[CODE_DELETE_EVENT]); 914 msg.Append("%s,", log_events_[event]);
863 msg.AppendAddress(from); 915 msg.AppendAddress(from);
916 msg.Append(',');
917 msg.AppendAddress(to, prev_to_);
918 prev_to_ = to;
864 if (FLAG_compress_log) { 919 if (FLAG_compress_log) {
865 ASSERT(compression_helper_ != NULL); 920 ASSERT(compression_helper_ != NULL);
866 if (!compression_helper_->HandleMessage(&msg)) return; 921 if (!compression_helper_->HandleMessage(&msg)) return;
867 } 922 }
868 msg.Append('\n'); 923 msg.Append('\n');
869 msg.WriteToLogFile(); 924 msg.WriteToLogFile();
870 #endif 925 #endif
871 } 926 }
872 927
873 928
874 void Logger::SnapshotPositionEvent(Address addr, int pos) { 929 void Logger::DeleteEventInternal(LogEventsAndTags event, Address from) {
875 #ifdef ENABLE_LOGGING_AND_PROFILING 930 #ifdef ENABLE_LOGGING_AND_PROFILING
876 if (!Log::IsEnabled() || !FLAG_log_snapshot_positions) return; 931 if (!Log::IsEnabled() || !FLAG_log_code) return;
877 LogMessageBuilder msg; 932 LogMessageBuilder msg;
878 msg.Append("%s,", log_events_[SNAPSHOT_POSITION_EVENT]); 933 msg.Append("%s,", log_events_[event]);
879 msg.AppendAddress(addr); 934 msg.AppendAddress(from);
880 msg.Append(",%d", pos);
881 if (FLAG_compress_log) { 935 if (FLAG_compress_log) {
882 ASSERT(compression_helper_ != NULL); 936 ASSERT(compression_helper_ != NULL);
883 if (!compression_helper_->HandleMessage(&msg)) return; 937 if (!compression_helper_->HandleMessage(&msg)) return;
884 } 938 }
885 msg.Append('\n'); 939 msg.Append('\n');
886 msg.WriteToLogFile(); 940 msg.WriteToLogFile();
887 #endif 941 #endif
888 } 942 }
889 943
890 944
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 DeleteArray(parameter_string); 1116 DeleteArray(parameter_string);
1063 msg.WriteToLogFile(); 1117 msg.WriteToLogFile();
1064 #endif 1118 #endif
1065 } 1119 }
1066 1120
1067 1121
1068 #ifdef ENABLE_LOGGING_AND_PROFILING 1122 #ifdef ENABLE_LOGGING_AND_PROFILING
1069 void Logger::TickEvent(TickSample* sample, bool overflow) { 1123 void Logger::TickEvent(TickSample* sample, bool overflow) {
1070 if (!Log::IsEnabled() || !FLAG_prof) return; 1124 if (!Log::IsEnabled() || !FLAG_prof) return;
1071 static Address prev_sp = NULL; 1125 static Address prev_sp = NULL;
1126 static Address prev_function = NULL;
1072 LogMessageBuilder msg; 1127 LogMessageBuilder msg;
1073 msg.Append("%s,", log_events_[TICK_EVENT]); 1128 msg.Append("%s,", log_events_[TICK_EVENT]);
1074 Address prev_addr = reinterpret_cast<Address>(sample->pc); 1129 Address prev_addr = sample->pc;
1075 msg.AppendAddress(prev_addr); 1130 msg.AppendAddress(prev_addr);
1076 msg.Append(','); 1131 msg.Append(',');
1077 msg.AppendAddress(reinterpret_cast<Address>(sample->sp), prev_sp); 1132 msg.AppendAddress(sample->sp, prev_sp);
1078 prev_sp = reinterpret_cast<Address>(sample->sp); 1133 prev_sp = sample->sp;
1134 msg.Append(',');
1135 msg.AppendAddress(sample->function, prev_function);
1136 prev_function = sample->function;
1079 msg.Append(",%d", static_cast<int>(sample->state)); 1137 msg.Append(",%d", static_cast<int>(sample->state));
1080 if (overflow) { 1138 if (overflow) {
1081 msg.Append(",overflow"); 1139 msg.Append(",overflow");
1082 } 1140 }
1083 for (int i = 0; i < sample->frames_count; ++i) { 1141 for (int i = 0; i < sample->frames_count; ++i) {
1084 msg.Append(','); 1142 msg.Append(',');
1085 msg.AppendAddress(sample->stack[i], prev_addr); 1143 msg.AppendAddress(sample->stack[i], prev_addr);
1086 prev_addr = sample->stack[i]; 1144 prev_addr = sample->stack[i];
1087 } 1145 }
1088 if (FLAG_compress_log) { 1146 if (FLAG_compress_log) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1137 const int modules_to_enable = ~GetActiveProfilerModules() & flags; 1195 const int modules_to_enable = ~GetActiveProfilerModules() & flags;
1138 if (modules_to_enable != PROFILER_MODULE_NONE) { 1196 if (modules_to_enable != PROFILER_MODULE_NONE) {
1139 is_logging_ = true; 1197 is_logging_ = true;
1140 } 1198 }
1141 if (modules_to_enable & PROFILER_MODULE_CPU) { 1199 if (modules_to_enable & PROFILER_MODULE_CPU) {
1142 if (FLAG_prof_lazy) { 1200 if (FLAG_prof_lazy) {
1143 profiler_->Engage(); 1201 profiler_->Engage();
1144 LOG(UncheckedStringEvent("profiler", "resume")); 1202 LOG(UncheckedStringEvent("profiler", "resume"));
1145 FLAG_log_code = true; 1203 FLAG_log_code = true;
1146 LogCompiledFunctions(); 1204 LogCompiledFunctions();
1205 LogFunctionObjects();
1147 LogAccessorCallbacks(); 1206 LogAccessorCallbacks();
1148 if (!FLAG_sliding_state_window) ticker_->Start(); 1207 if (!FLAG_sliding_state_window) ticker_->Start();
1149 } 1208 }
1150 profiler_->resume(); 1209 profiler_->resume();
1151 } 1210 }
1152 if (modules_to_enable & 1211 if (modules_to_enable &
1153 (PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) { 1212 (PROFILER_MODULE_HEAP_STATS | PROFILER_MODULE_JS_CONSTRUCTORS)) {
1154 FLAG_log_gc = true; 1213 FLAG_log_gc = true;
1155 } 1214 }
1156 } 1215 }
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1283 } else { 1342 } else {
1284 LOG(CodeCreateEvent( 1343 LOG(CodeCreateEvent(
1285 Logger::LAZY_COMPILE_TAG, shared->code(), *func_name)); 1344 Logger::LAZY_COMPILE_TAG, shared->code(), *func_name));
1286 } 1345 }
1287 } 1346 }
1288 1347
1289 DeleteArray(sfis); 1348 DeleteArray(sfis);
1290 } 1349 }
1291 1350
1292 1351
1352 void Logger::LogFunctionObjects() {
1353 AssertNoAllocation no_alloc;
1354 HeapIterator iterator;
1355 while (iterator.has_next()) {
1356 HeapObject* obj = iterator.next();
1357 ASSERT(obj != NULL);
1358 if (!obj->IsJSFunction()) continue;
1359 JSFunction* jsf = JSFunction::cast(obj);
1360 if (!jsf->is_compiled()) continue;
1361 LOG(FunctionCreateEvent(jsf));
1362 }
1363 }
1364
1365
1293 void Logger::LogAccessorCallbacks() { 1366 void Logger::LogAccessorCallbacks() {
1294 AssertNoAllocation no_alloc; 1367 AssertNoAllocation no_alloc;
1295 HeapIterator iterator; 1368 HeapIterator iterator;
1296 while (iterator.has_next()) { 1369 while (iterator.has_next()) {
1297 HeapObject* obj = iterator.next(); 1370 HeapObject* obj = iterator.next();
1298 ASSERT(obj != NULL); 1371 ASSERT(obj != NULL);
1299 if (!obj->IsAccessorInfo()) continue; 1372 if (!obj->IsAccessorInfo()) continue;
1300 AccessorInfo* ai = AccessorInfo::cast(obj); 1373 AccessorInfo* ai = AccessorInfo::cast(obj);
1301 if (!ai->name()->IsString()) continue; 1374 if (!ai->name()->IsString()) continue;
1302 String* name = String::cast(ai->name()); 1375 String* name = String::cast(ai->name());
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1465 // Otherwise, if the sliding state window computation has not been 1538 // Otherwise, if the sliding state window computation has not been
1466 // started we do it now. 1539 // started we do it now.
1467 if (sliding_state_window_ == NULL) { 1540 if (sliding_state_window_ == NULL) {
1468 sliding_state_window_ = new SlidingStateWindow(); 1541 sliding_state_window_ = new SlidingStateWindow();
1469 } 1542 }
1470 #endif 1543 #endif
1471 } 1544 }
1472 1545
1473 1546
1474 } } // namespace v8::internal 1547 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/log.h ('k') | src/mark-compact.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698