OLD | NEW |
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 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 } | 296 } |
297 | 297 |
298 // Start thread processing the profiler buffer. | 298 // Start thread processing the profiler buffer. |
299 running_ = true; | 299 running_ = true; |
300 Start(); | 300 Start(); |
301 | 301 |
302 // Register to get ticks. | 302 // Register to get ticks. |
303 Logger::ticker_->SetProfiler(this); | 303 Logger::ticker_->SetProfiler(this); |
304 | 304 |
305 Logger::ProfilerBeginEvent(); | 305 Logger::ProfilerBeginEvent(); |
| 306 Logger::LogAliases(); |
306 } | 307 } |
307 | 308 |
308 | 309 |
309 void Profiler::Disengage() { | 310 void Profiler::Disengage() { |
310 if (!engaged_) return; | 311 if (!engaged_) return; |
311 | 312 |
312 // Stop receiving ticks. | 313 // Stop receiving ticks. |
313 Logger::ticker_->ClearProfiler(); | 314 Logger::ticker_->ClearProfiler(); |
314 | 315 |
315 // Terminate the worker thread by setting running_ to false, | 316 // Terminate the worker thread by setting running_ to false, |
(...skipping 19 matching lines...) Expand all Loading... |
335 } | 336 } |
336 } | 337 } |
337 | 338 |
338 | 339 |
339 // | 340 // |
340 // Logger class implementation. | 341 // Logger class implementation. |
341 // | 342 // |
342 Ticker* Logger::ticker_ = NULL; | 343 Ticker* Logger::ticker_ = NULL; |
343 Profiler* Logger::profiler_ = NULL; | 344 Profiler* Logger::profiler_ = NULL; |
344 SlidingStateWindow* Logger::sliding_state_window_ = NULL; | 345 SlidingStateWindow* Logger::sliding_state_window_ = NULL; |
| 346 const char** Logger::log_events_ = NULL; |
| 347 CompressionHelper* Logger::compression_helper_ = NULL; |
345 int Logger::logging_nesting_ = 0; | 348 int Logger::logging_nesting_ = 0; |
346 int Logger::cpu_profiler_nesting_ = 0; | 349 int Logger::cpu_profiler_nesting_ = 0; |
347 int Logger::heap_profiler_nesting_ = 0; | 350 int Logger::heap_profiler_nesting_ = 0; |
348 | 351 |
349 #define DECLARE_EVENT(ignore1, name) name, | 352 #define DECLARE_LONG_EVENT(ignore1, long_name, ignore2) long_name, |
350 const char* kLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = { | 353 const char* kLongLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = { |
351 LOG_EVENTS_AND_TAGS_LIST(DECLARE_EVENT) | 354 LOG_EVENTS_AND_TAGS_LIST(DECLARE_LONG_EVENT) |
352 }; | 355 }; |
353 #undef DECLARE_EVENT | 356 #undef DECLARE_LONG_EVENT |
| 357 |
| 358 #define DECLARE_SHORT_EVENT(ignore1, ignore2, short_name) short_name, |
| 359 const char* kCompressedLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = { |
| 360 LOG_EVENTS_AND_TAGS_LIST(DECLARE_SHORT_EVENT) |
| 361 }; |
| 362 #undef DECLARE_SHORT_EVENT |
354 | 363 |
355 | 364 |
356 void Logger::ProfilerBeginEvent() { | 365 void Logger::ProfilerBeginEvent() { |
357 if (!Log::IsEnabled()) return; | 366 if (!Log::IsEnabled()) return; |
358 LogMessageBuilder msg; | 367 LogMessageBuilder msg; |
359 msg.Append("profiler,\"begin\",%d\n", kSamplingIntervalMs); | 368 msg.Append("profiler,\"begin\",%d\n", kSamplingIntervalMs); |
| 369 if (FLAG_compress_log) { |
| 370 msg.Append("profiler,\"compression\",%d\n", kCompressionWindowSize); |
| 371 } |
360 msg.WriteToLogFile(); | 372 msg.WriteToLogFile(); |
361 } | 373 } |
362 | 374 |
| 375 |
| 376 void Logger::LogAliases() { |
| 377 if (!Log::IsEnabled() || !FLAG_compress_log) return; |
| 378 LogMessageBuilder msg; |
| 379 for (int i = 0; i < NUMBER_OF_LOG_EVENTS; ++i) { |
| 380 msg.Append("alias,%s,%s\n", |
| 381 kCompressedLogEventsNames[i], kLongLogEventsNames[i]); |
| 382 } |
| 383 msg.WriteToLogFile(); |
| 384 } |
| 385 |
363 #endif // ENABLE_LOGGING_AND_PROFILING | 386 #endif // ENABLE_LOGGING_AND_PROFILING |
364 | 387 |
365 | 388 |
366 void Logger::StringEvent(const char* name, const char* value) { | 389 void Logger::StringEvent(const char* name, const char* value) { |
367 #ifdef ENABLE_LOGGING_AND_PROFILING | 390 #ifdef ENABLE_LOGGING_AND_PROFILING |
368 if (FLAG_log) UncheckedStringEvent(name, value); | 391 if (FLAG_log) UncheckedStringEvent(name, value); |
369 #endif | 392 #endif |
370 } | 393 } |
371 | 394 |
372 | 395 |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
657 #ifdef ENABLE_LOGGING_AND_PROFILING | 680 #ifdef ENABLE_LOGGING_AND_PROFILING |
658 if (!Log::IsEnabled() || !FLAG_log) return; | 681 if (!Log::IsEnabled() || !FLAG_log) return; |
659 LogMessageBuilder msg; | 682 LogMessageBuilder msg; |
660 msg.Append("delete,%s,0x%" V8PRIxPTR "\n", name, object); | 683 msg.Append("delete,%s,0x%" V8PRIxPTR "\n", name, object); |
661 msg.WriteToLogFile(); | 684 msg.WriteToLogFile(); |
662 #endif | 685 #endif |
663 } | 686 } |
664 | 687 |
665 | 688 |
666 #ifdef ENABLE_LOGGING_AND_PROFILING | 689 #ifdef ENABLE_LOGGING_AND_PROFILING |
| 690 |
| 691 // A class that contains all common code dealing with record compression. |
| 692 class CompressionHelper { |
| 693 public: |
| 694 explicit CompressionHelper(int window_size) |
| 695 : compressor_(window_size), repeat_count_(0) { } |
| 696 |
| 697 // Handles storing message in compressor, retrieving the previous one and |
| 698 // prefixing it with repeat count, if needed. |
| 699 // Returns true if message needs to be written to log. |
| 700 bool HandleMessage(LogMessageBuilder* msg) { |
| 701 if (!msg->StoreInCompressor(&compressor_)) { |
| 702 // Current message repeats the previous one, don't write it. |
| 703 ++repeat_count_; |
| 704 return false; |
| 705 } |
| 706 if (repeat_count_ == 0) { |
| 707 return msg->RetrieveCompressedPrevious(&compressor_); |
| 708 } |
| 709 OS::SNPrintF(prefix_, "%s,%d,", |
| 710 Logger::log_events_[Logger::REPEAT_META_EVENT], |
| 711 repeat_count_ + 1); |
| 712 repeat_count_ = 0; |
| 713 return msg->RetrieveCompressedPrevious(&compressor_, prefix_.start()); |
| 714 } |
| 715 |
| 716 private: |
| 717 LogRecordCompressor compressor_; |
| 718 int repeat_count_; |
| 719 EmbeddedVector<char, 20> prefix_; |
| 720 }; |
| 721 |
| 722 #endif // ENABLE_LOGGING_AND_PROFILING |
| 723 |
| 724 |
| 725 #ifdef ENABLE_LOGGING_AND_PROFILING |
667 void Logger::CallbackEventInternal(const char* prefix, const char* name, | 726 void Logger::CallbackEventInternal(const char* prefix, const char* name, |
668 Address entry_point) { | 727 Address entry_point) { |
669 if (!Log::IsEnabled() || !FLAG_log_code) return; | 728 if (!Log::IsEnabled() || !FLAG_log_code) return; |
670 LogMessageBuilder msg; | 729 LogMessageBuilder msg; |
671 msg.Append("%s,%s,", | 730 msg.Append("%s,%s,", |
672 kLogEventsNames[CODE_CREATION_EVENT], | 731 log_events_[CODE_CREATION_EVENT], log_events_[CALLBACK_TAG]); |
673 kLogEventsNames[CALLBACK_TAG]); | |
674 msg.AppendAddress(entry_point); | 732 msg.AppendAddress(entry_point); |
675 msg.Append(",1,\"%s%s\"", prefix, name); | 733 msg.Append(",1,\"%s%s\"", prefix, name); |
| 734 if (FLAG_compress_log) { |
| 735 ASSERT(compression_helper_ != NULL); |
| 736 if (!compression_helper_->HandleMessage(&msg)) return; |
| 737 } |
676 msg.Append('\n'); | 738 msg.Append('\n'); |
677 msg.WriteToLogFile(); | 739 msg.WriteToLogFile(); |
678 } | 740 } |
679 #endif | 741 #endif |
680 | 742 |
681 | 743 |
682 void Logger::CallbackEvent(String* name, Address entry_point) { | 744 void Logger::CallbackEvent(String* name, Address entry_point) { |
683 #ifdef ENABLE_LOGGING_AND_PROFILING | 745 #ifdef ENABLE_LOGGING_AND_PROFILING |
684 if (!Log::IsEnabled() || !FLAG_log_code) return; | 746 if (!Log::IsEnabled() || !FLAG_log_code) return; |
685 SmartPointer<char> str = | 747 SmartPointer<char> str = |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 } | 779 } |
718 } | 780 } |
719 | 781 |
720 | 782 |
721 void Logger::CodeCreateEvent(LogEventsAndTags tag, | 783 void Logger::CodeCreateEvent(LogEventsAndTags tag, |
722 Code* code, | 784 Code* code, |
723 const char* comment) { | 785 const char* comment) { |
724 #ifdef ENABLE_LOGGING_AND_PROFILING | 786 #ifdef ENABLE_LOGGING_AND_PROFILING |
725 if (!Log::IsEnabled() || !FLAG_log_code) return; | 787 if (!Log::IsEnabled() || !FLAG_log_code) return; |
726 LogMessageBuilder msg; | 788 LogMessageBuilder msg; |
727 msg.Append("%s,%s,", | 789 msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); |
728 kLogEventsNames[CODE_CREATION_EVENT], | |
729 kLogEventsNames[tag]); | |
730 msg.AppendAddress(code->address()); | 790 msg.AppendAddress(code->address()); |
731 msg.Append(",%d,\"%s", code->ExecutableSize(), ComputeMarker(code)); | 791 msg.Append(",%d,\"%s", code->ExecutableSize(), ComputeMarker(code)); |
732 for (const char* p = comment; *p != '\0'; p++) { | 792 for (const char* p = comment; *p != '\0'; p++) { |
733 if (*p == '"') { | 793 if (*p == '"') { |
734 msg.Append('\\'); | 794 msg.Append('\\'); |
735 } | 795 } |
736 msg.Append(*p); | 796 msg.Append(*p); |
737 } | 797 } |
738 msg.Append('"'); | 798 msg.Append('"'); |
739 LowLevelCodeCreateEvent(code, &msg); | 799 LowLevelCodeCreateEvent(code, &msg); |
| 800 if (FLAG_compress_log) { |
| 801 ASSERT(compression_helper_ != NULL); |
| 802 if (!compression_helper_->HandleMessage(&msg)) return; |
| 803 } |
740 msg.Append('\n'); | 804 msg.Append('\n'); |
741 msg.WriteToLogFile(); | 805 msg.WriteToLogFile(); |
742 #endif | 806 #endif |
743 } | 807 } |
744 | 808 |
745 | 809 |
746 void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, String* name) { | 810 void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, String* name) { |
747 #ifdef ENABLE_LOGGING_AND_PROFILING | 811 #ifdef ENABLE_LOGGING_AND_PROFILING |
748 if (!Log::IsEnabled() || !FLAG_log_code) return; | 812 if (!Log::IsEnabled() || !FLAG_log_code) return; |
749 LogMessageBuilder msg; | 813 LogMessageBuilder msg; |
750 SmartPointer<char> str = | 814 SmartPointer<char> str = |
751 name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | 815 name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
752 msg.Append("%s,%s,", | 816 msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); |
753 kLogEventsNames[CODE_CREATION_EVENT], | |
754 kLogEventsNames[tag]); | |
755 msg.AppendAddress(code->address()); | 817 msg.AppendAddress(code->address()); |
756 msg.Append(",%d,\"%s%s\"", code->ExecutableSize(), ComputeMarker(code), *str); | 818 msg.Append(",%d,\"%s%s\"", code->ExecutableSize(), ComputeMarker(code), *str); |
757 LowLevelCodeCreateEvent(code, &msg); | 819 LowLevelCodeCreateEvent(code, &msg); |
| 820 if (FLAG_compress_log) { |
| 821 ASSERT(compression_helper_ != NULL); |
| 822 if (!compression_helper_->HandleMessage(&msg)) return; |
| 823 } |
758 msg.Append('\n'); | 824 msg.Append('\n'); |
759 msg.WriteToLogFile(); | 825 msg.WriteToLogFile(); |
760 #endif | 826 #endif |
761 } | 827 } |
762 | 828 |
763 | 829 |
764 void Logger::CodeCreateEvent(LogEventsAndTags tag, | 830 void Logger::CodeCreateEvent(LogEventsAndTags tag, |
765 Code* code, String* name, | 831 Code* code, String* name, |
766 String* source, int line) { | 832 String* source, int line) { |
767 #ifdef ENABLE_LOGGING_AND_PROFILING | 833 #ifdef ENABLE_LOGGING_AND_PROFILING |
768 if (!Log::IsEnabled() || !FLAG_log_code) return; | 834 if (!Log::IsEnabled() || !FLAG_log_code) return; |
769 LogMessageBuilder msg; | 835 LogMessageBuilder msg; |
770 SmartPointer<char> str = | 836 SmartPointer<char> str = |
771 name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | 837 name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
772 SmartPointer<char> sourcestr = | 838 SmartPointer<char> sourcestr = |
773 source->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | 839 source->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
774 msg.Append("%s,%s,", | 840 msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); |
775 kLogEventsNames[CODE_CREATION_EVENT], | |
776 kLogEventsNames[tag]); | |
777 msg.AppendAddress(code->address()); | 841 msg.AppendAddress(code->address()); |
778 msg.Append(",%d,\"%s%s %s:%d\"", | 842 msg.Append(",%d,\"%s%s %s:%d\"", |
779 code->ExecutableSize(), | 843 code->ExecutableSize(), |
780 ComputeMarker(code), | 844 ComputeMarker(code), |
781 *str, | 845 *str, |
782 *sourcestr, | 846 *sourcestr, |
783 line); | 847 line); |
784 LowLevelCodeCreateEvent(code, &msg); | 848 LowLevelCodeCreateEvent(code, &msg); |
| 849 if (FLAG_compress_log) { |
| 850 ASSERT(compression_helper_ != NULL); |
| 851 if (!compression_helper_->HandleMessage(&msg)) return; |
| 852 } |
785 msg.Append('\n'); | 853 msg.Append('\n'); |
786 msg.WriteToLogFile(); | 854 msg.WriteToLogFile(); |
787 #endif | 855 #endif |
788 } | 856 } |
789 | 857 |
790 | 858 |
791 void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count) { | 859 void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count) { |
792 #ifdef ENABLE_LOGGING_AND_PROFILING | 860 #ifdef ENABLE_LOGGING_AND_PROFILING |
793 if (!Log::IsEnabled() || !FLAG_log_code) return; | 861 if (!Log::IsEnabled() || !FLAG_log_code) return; |
794 LogMessageBuilder msg; | 862 LogMessageBuilder msg; |
795 msg.Append("%s,%s,", | 863 msg.Append("%s,%s,", log_events_[CODE_CREATION_EVENT], log_events_[tag]); |
796 kLogEventsNames[CODE_CREATION_EVENT], | |
797 kLogEventsNames[tag]); | |
798 msg.AppendAddress(code->address()); | 864 msg.AppendAddress(code->address()); |
799 msg.Append(",%d,\"args_count: %d\"", code->ExecutableSize(), args_count); | 865 msg.Append(",%d,\"args_count: %d\"", code->ExecutableSize(), args_count); |
800 LowLevelCodeCreateEvent(code, &msg); | 866 LowLevelCodeCreateEvent(code, &msg); |
| 867 if (FLAG_compress_log) { |
| 868 ASSERT(compression_helper_ != NULL); |
| 869 if (!compression_helper_->HandleMessage(&msg)) return; |
| 870 } |
801 msg.Append('\n'); | 871 msg.Append('\n'); |
802 msg.WriteToLogFile(); | 872 msg.WriteToLogFile(); |
803 #endif | 873 #endif |
804 } | 874 } |
805 | 875 |
806 | 876 |
807 void Logger::CodeMovingGCEvent() { | 877 void Logger::CodeMovingGCEvent() { |
808 #ifdef ENABLE_LOGGING_AND_PROFILING | 878 #ifdef ENABLE_LOGGING_AND_PROFILING |
809 if (!Log::IsEnabled() || !FLAG_log_code || !FLAG_ll_prof) return; | 879 if (!Log::IsEnabled() || !FLAG_log_code || !FLAG_ll_prof) return; |
810 LogMessageBuilder msg; | 880 LogMessageBuilder msg; |
811 msg.Append("%s\n", kLogEventsNames[CODE_MOVING_GC]); | 881 msg.Append("%s\n", log_events_[CODE_MOVING_GC]); |
812 msg.WriteToLogFile(); | 882 msg.WriteToLogFile(); |
813 OS::SignalCodeMovingGC(); | 883 OS::SignalCodeMovingGC(); |
814 #endif | 884 #endif |
815 } | 885 } |
816 | 886 |
817 | 887 |
818 void Logger::RegExpCodeCreateEvent(Code* code, String* source) { | 888 void Logger::RegExpCodeCreateEvent(Code* code, String* source) { |
819 #ifdef ENABLE_LOGGING_AND_PROFILING | 889 #ifdef ENABLE_LOGGING_AND_PROFILING |
820 if (!Log::IsEnabled() || !FLAG_log_code) return; | 890 if (!Log::IsEnabled() || !FLAG_log_code) return; |
821 LogMessageBuilder msg; | 891 LogMessageBuilder msg; |
822 msg.Append("%s,%s,", | 892 msg.Append("%s,%s,", |
823 kLogEventsNames[CODE_CREATION_EVENT], | 893 log_events_[CODE_CREATION_EVENT], log_events_[REG_EXP_TAG]); |
824 kLogEventsNames[REG_EXP_TAG]); | |
825 msg.AppendAddress(code->address()); | 894 msg.AppendAddress(code->address()); |
826 msg.Append(",%d,\"", code->ExecutableSize()); | 895 msg.Append(",%d,\"", code->ExecutableSize()); |
827 msg.AppendDetailed(source, false); | 896 msg.AppendDetailed(source, false); |
828 msg.Append('\"'); | 897 msg.Append('\"'); |
829 LowLevelCodeCreateEvent(code, &msg); | 898 LowLevelCodeCreateEvent(code, &msg); |
| 899 if (FLAG_compress_log) { |
| 900 ASSERT(compression_helper_ != NULL); |
| 901 if (!compression_helper_->HandleMessage(&msg)) return; |
| 902 } |
830 msg.Append('\n'); | 903 msg.Append('\n'); |
831 msg.WriteToLogFile(); | 904 msg.WriteToLogFile(); |
832 #endif | 905 #endif |
833 } | 906 } |
834 | 907 |
835 | 908 |
836 void Logger::CodeMoveEvent(Address from, Address to) { | 909 void Logger::CodeMoveEvent(Address from, Address to) { |
837 #ifdef ENABLE_LOGGING_AND_PROFILING | 910 #ifdef ENABLE_LOGGING_AND_PROFILING |
838 MoveEventInternal(CODE_MOVE_EVENT, from, to); | 911 MoveEventInternal(CODE_MOVE_EVENT, from, to); |
839 #endif | 912 #endif |
840 } | 913 } |
841 | 914 |
842 | 915 |
843 void Logger::CodeDeleteEvent(Address from) { | 916 void Logger::CodeDeleteEvent(Address from) { |
844 #ifdef ENABLE_LOGGING_AND_PROFILING | 917 #ifdef ENABLE_LOGGING_AND_PROFILING |
845 DeleteEventInternal(CODE_DELETE_EVENT, from); | 918 DeleteEventInternal(CODE_DELETE_EVENT, from); |
846 #endif | 919 #endif |
847 } | 920 } |
848 | 921 |
849 | 922 |
850 void Logger::SnapshotPositionEvent(Address addr, int pos) { | 923 void Logger::SnapshotPositionEvent(Address addr, int pos) { |
851 #ifdef ENABLE_LOGGING_AND_PROFILING | 924 #ifdef ENABLE_LOGGING_AND_PROFILING |
852 if (!Log::IsEnabled() || !FLAG_log_snapshot_positions) return; | 925 if (!Log::IsEnabled() || !FLAG_log_snapshot_positions) return; |
853 LogMessageBuilder msg; | 926 LogMessageBuilder msg; |
854 msg.Append("%s,", kLogEventsNames[SNAPSHOT_POSITION_EVENT]); | 927 msg.Append("%s,", log_events_[SNAPSHOT_POSITION_EVENT]); |
855 msg.AppendAddress(addr); | 928 msg.AppendAddress(addr); |
856 msg.Append(",%d", pos); | 929 msg.Append(",%d", pos); |
| 930 if (FLAG_compress_log) { |
| 931 ASSERT(compression_helper_ != NULL); |
| 932 if (!compression_helper_->HandleMessage(&msg)) return; |
| 933 } |
857 msg.Append('\n'); | 934 msg.Append('\n'); |
858 msg.WriteToLogFile(); | 935 msg.WriteToLogFile(); |
859 #endif | 936 #endif |
860 } | 937 } |
861 | 938 |
862 | 939 |
863 void Logger::FunctionCreateEvent(JSFunction* function) { | 940 void Logger::FunctionCreateEvent(JSFunction* function) { |
864 #ifdef ENABLE_LOGGING_AND_PROFILING | 941 #ifdef ENABLE_LOGGING_AND_PROFILING |
865 // This function can be called from GC iterators (during Scavenge, | 942 // This function can be called from GC iterators (during Scavenge, |
866 // MC, and MS), so marking bits can be set on objects. That's | 943 // MC, and MS), so marking bits can be set on objects. That's |
867 // why unchecked accessors are used here. | 944 // why unchecked accessors are used here. |
| 945 static Address prev_code = NULL; |
868 if (!Log::IsEnabled() || !FLAG_log_code) return; | 946 if (!Log::IsEnabled() || !FLAG_log_code) return; |
869 LogMessageBuilder msg; | 947 LogMessageBuilder msg; |
870 msg.Append("%s,", kLogEventsNames[FUNCTION_CREATION_EVENT]); | 948 msg.Append("%s,", log_events_[FUNCTION_CREATION_EVENT]); |
871 msg.AppendAddress(function->address()); | 949 msg.AppendAddress(function->address()); |
872 msg.Append(','); | 950 msg.Append(','); |
873 msg.AppendAddress(function->unchecked_code()->address()); | 951 msg.AppendAddress(function->unchecked_code()->address(), prev_code); |
| 952 prev_code = function->unchecked_code()->address(); |
| 953 if (FLAG_compress_log) { |
| 954 ASSERT(compression_helper_ != NULL); |
| 955 if (!compression_helper_->HandleMessage(&msg)) return; |
| 956 } |
874 msg.Append('\n'); | 957 msg.Append('\n'); |
875 msg.WriteToLogFile(); | 958 msg.WriteToLogFile(); |
876 #endif | 959 #endif |
877 } | 960 } |
878 | 961 |
879 | 962 |
880 void Logger::FunctionCreateEventFromMove(JSFunction* function) { | 963 void Logger::FunctionCreateEventFromMove(JSFunction* function) { |
881 #ifdef ENABLE_LOGGING_AND_PROFILING | 964 #ifdef ENABLE_LOGGING_AND_PROFILING |
882 if (function->unchecked_code() != Builtins::builtin(Builtins::LazyCompile)) { | 965 if (function->unchecked_code() != Builtins::builtin(Builtins::LazyCompile)) { |
883 FunctionCreateEvent(function); | 966 FunctionCreateEvent(function); |
(...skipping 13 matching lines...) Expand all Loading... |
897 #ifdef ENABLE_LOGGING_AND_PROFILING | 980 #ifdef ENABLE_LOGGING_AND_PROFILING |
898 DeleteEventInternal(FUNCTION_DELETE_EVENT, from); | 981 DeleteEventInternal(FUNCTION_DELETE_EVENT, from); |
899 #endif | 982 #endif |
900 } | 983 } |
901 | 984 |
902 | 985 |
903 #ifdef ENABLE_LOGGING_AND_PROFILING | 986 #ifdef ENABLE_LOGGING_AND_PROFILING |
904 void Logger::MoveEventInternal(LogEventsAndTags event, | 987 void Logger::MoveEventInternal(LogEventsAndTags event, |
905 Address from, | 988 Address from, |
906 Address to) { | 989 Address to) { |
| 990 static Address prev_to_ = NULL; |
907 if (!Log::IsEnabled() || !FLAG_log_code) return; | 991 if (!Log::IsEnabled() || !FLAG_log_code) return; |
908 LogMessageBuilder msg; | 992 LogMessageBuilder msg; |
909 msg.Append("%s,", kLogEventsNames[event]); | 993 msg.Append("%s,", log_events_[event]); |
910 msg.AppendAddress(from); | 994 msg.AppendAddress(from); |
911 msg.Append(','); | 995 msg.Append(','); |
912 msg.AppendAddress(to); | 996 msg.AppendAddress(to, prev_to_); |
| 997 prev_to_ = to; |
| 998 if (FLAG_compress_log) { |
| 999 ASSERT(compression_helper_ != NULL); |
| 1000 if (!compression_helper_->HandleMessage(&msg)) return; |
| 1001 } |
913 msg.Append('\n'); | 1002 msg.Append('\n'); |
914 msg.WriteToLogFile(); | 1003 msg.WriteToLogFile(); |
915 } | 1004 } |
916 #endif | 1005 #endif |
917 | 1006 |
918 | 1007 |
919 #ifdef ENABLE_LOGGING_AND_PROFILING | 1008 #ifdef ENABLE_LOGGING_AND_PROFILING |
920 void Logger::DeleteEventInternal(LogEventsAndTags event, Address from) { | 1009 void Logger::DeleteEventInternal(LogEventsAndTags event, Address from) { |
921 if (!Log::IsEnabled() || !FLAG_log_code) return; | 1010 if (!Log::IsEnabled() || !FLAG_log_code) return; |
922 LogMessageBuilder msg; | 1011 LogMessageBuilder msg; |
923 msg.Append("%s,", kLogEventsNames[event]); | 1012 msg.Append("%s,", log_events_[event]); |
924 msg.AppendAddress(from); | 1013 msg.AppendAddress(from); |
| 1014 if (FLAG_compress_log) { |
| 1015 ASSERT(compression_helper_ != NULL); |
| 1016 if (!compression_helper_->HandleMessage(&msg)) return; |
| 1017 } |
925 msg.Append('\n'); | 1018 msg.Append('\n'); |
926 msg.WriteToLogFile(); | 1019 msg.WriteToLogFile(); |
927 } | 1020 } |
928 #endif | 1021 #endif |
929 | 1022 |
930 | 1023 |
931 void Logger::ResourceEvent(const char* name, const char* tag) { | 1024 void Logger::ResourceEvent(const char* name, const char* tag) { |
932 #ifdef ENABLE_LOGGING_AND_PROFILING | 1025 #ifdef ENABLE_LOGGING_AND_PROFILING |
933 if (!Log::IsEnabled() || !FLAG_log) return; | 1026 if (!Log::IsEnabled() || !FLAG_log) return; |
934 LogMessageBuilder msg; | 1027 LogMessageBuilder msg; |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 parameter_string); | 1195 parameter_string); |
1103 DeleteArray(parameter_string); | 1196 DeleteArray(parameter_string); |
1104 msg.WriteToLogFile(); | 1197 msg.WriteToLogFile(); |
1105 #endif | 1198 #endif |
1106 } | 1199 } |
1107 | 1200 |
1108 | 1201 |
1109 #ifdef ENABLE_LOGGING_AND_PROFILING | 1202 #ifdef ENABLE_LOGGING_AND_PROFILING |
1110 void Logger::TickEvent(TickSample* sample, bool overflow) { | 1203 void Logger::TickEvent(TickSample* sample, bool overflow) { |
1111 if (!Log::IsEnabled() || !FLAG_prof) return; | 1204 if (!Log::IsEnabled() || !FLAG_prof) return; |
| 1205 static Address prev_sp = NULL; |
| 1206 static Address prev_function = NULL; |
1112 LogMessageBuilder msg; | 1207 LogMessageBuilder msg; |
1113 msg.Append("%s,", kLogEventsNames[TICK_EVENT]); | 1208 msg.Append("%s,", log_events_[TICK_EVENT]); |
1114 msg.AppendAddress(sample->pc); | 1209 Address prev_addr = sample->pc; |
| 1210 msg.AppendAddress(prev_addr); |
1115 msg.Append(','); | 1211 msg.Append(','); |
1116 msg.AppendAddress(sample->sp); | 1212 msg.AppendAddress(sample->sp, prev_sp); |
| 1213 prev_sp = sample->sp; |
1117 msg.Append(','); | 1214 msg.Append(','); |
1118 msg.AppendAddress(sample->function); | 1215 msg.AppendAddress(sample->function, prev_function); |
| 1216 prev_function = sample->function; |
1119 msg.Append(",%d", static_cast<int>(sample->state)); | 1217 msg.Append(",%d", static_cast<int>(sample->state)); |
1120 if (overflow) { | 1218 if (overflow) { |
1121 msg.Append(",overflow"); | 1219 msg.Append(",overflow"); |
1122 } | 1220 } |
1123 for (int i = 0; i < sample->frames_count; ++i) { | 1221 for (int i = 0; i < sample->frames_count; ++i) { |
1124 msg.Append(','); | 1222 msg.Append(','); |
1125 msg.AppendAddress(sample->stack[i]); | 1223 msg.AppendAddress(sample->stack[i], prev_addr); |
| 1224 prev_addr = sample->stack[i]; |
| 1225 } |
| 1226 if (FLAG_compress_log) { |
| 1227 ASSERT(compression_helper_ != NULL); |
| 1228 if (!compression_helper_->HandleMessage(&msg)) return; |
1126 } | 1229 } |
1127 msg.Append('\n'); | 1230 msg.Append('\n'); |
1128 msg.WriteToLogFile(); | 1231 msg.WriteToLogFile(); |
1129 } | 1232 } |
1130 | 1233 |
1131 | 1234 |
1132 int Logger::GetActiveProfilerModules() { | 1235 int Logger::GetActiveProfilerModules() { |
1133 int result = PROFILER_MODULE_NONE; | 1236 int result = PROFILER_MODULE_NONE; |
1134 if (profiler_ != NULL && !profiler_->paused()) { | 1237 if (profiler_ != NULL && !profiler_->paused()) { |
1135 result |= PROFILER_MODULE_CPU; | 1238 result |= PROFILER_MODULE_CPU; |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1544 } | 1647 } |
1545 | 1648 |
1546 if (FLAG_ll_prof) LogCodeInfo(); | 1649 if (FLAG_ll_prof) LogCodeInfo(); |
1547 | 1650 |
1548 ticker_ = new Ticker(kSamplingIntervalMs); | 1651 ticker_ = new Ticker(kSamplingIntervalMs); |
1549 | 1652 |
1550 if (FLAG_sliding_state_window && sliding_state_window_ == NULL) { | 1653 if (FLAG_sliding_state_window && sliding_state_window_ == NULL) { |
1551 sliding_state_window_ = new SlidingStateWindow(); | 1654 sliding_state_window_ = new SlidingStateWindow(); |
1552 } | 1655 } |
1553 | 1656 |
| 1657 log_events_ = FLAG_compress_log ? |
| 1658 kCompressedLogEventsNames : kLongLogEventsNames; |
| 1659 if (FLAG_compress_log) { |
| 1660 compression_helper_ = new CompressionHelper(kCompressionWindowSize); |
| 1661 } |
| 1662 |
1554 if (start_logging) { | 1663 if (start_logging) { |
1555 logging_nesting_ = 1; | 1664 logging_nesting_ = 1; |
1556 } | 1665 } |
1557 | 1666 |
1558 if (FLAG_prof) { | 1667 if (FLAG_prof) { |
1559 profiler_ = new Profiler(); | 1668 profiler_ = new Profiler(); |
1560 if (!FLAG_prof_auto) { | 1669 if (!FLAG_prof_auto) { |
1561 profiler_->pause(); | 1670 profiler_->pause(); |
1562 } else { | 1671 } else { |
1563 logging_nesting_ = 1; | 1672 logging_nesting_ = 1; |
(...skipping 27 matching lines...) Expand all Loading... |
1591 #ifdef ENABLE_LOGGING_AND_PROFILING | 1700 #ifdef ENABLE_LOGGING_AND_PROFILING |
1592 LogMessageBuilder::set_write_failure_handler(NULL); | 1701 LogMessageBuilder::set_write_failure_handler(NULL); |
1593 | 1702 |
1594 // Stop the profiler before closing the file. | 1703 // Stop the profiler before closing the file. |
1595 if (profiler_ != NULL) { | 1704 if (profiler_ != NULL) { |
1596 profiler_->Disengage(); | 1705 profiler_->Disengage(); |
1597 delete profiler_; | 1706 delete profiler_; |
1598 profiler_ = NULL; | 1707 profiler_ = NULL; |
1599 } | 1708 } |
1600 | 1709 |
| 1710 delete compression_helper_; |
| 1711 compression_helper_ = NULL; |
| 1712 |
1601 delete sliding_state_window_; | 1713 delete sliding_state_window_; |
1602 sliding_state_window_ = NULL; | 1714 sliding_state_window_ = NULL; |
1603 | 1715 |
1604 delete ticker_; | 1716 delete ticker_; |
1605 ticker_ = NULL; | 1717 ticker_ = NULL; |
1606 | 1718 |
1607 Log::Close(); | 1719 Log::Close(); |
1608 #endif | 1720 #endif |
1609 } | 1721 } |
1610 | 1722 |
(...skipping 10 matching lines...) Expand all Loading... |
1621 } | 1733 } |
1622 // Otherwise, if the sliding state window computation has not been | 1734 // Otherwise, if the sliding state window computation has not been |
1623 // started we do it now. | 1735 // started we do it now. |
1624 if (sliding_state_window_ == NULL) { | 1736 if (sliding_state_window_ == NULL) { |
1625 sliding_state_window_ = new SlidingStateWindow(); | 1737 sliding_state_window_ = new SlidingStateWindow(); |
1626 } | 1738 } |
1627 #endif | 1739 #endif |
1628 } | 1740 } |
1629 | 1741 |
1630 } } // namespace v8::internal | 1742 } } // namespace v8::internal |
OLD | NEW |