| 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 |