blob: c84e99e96b18fce4bb1aa9584ad6dd5ca7f20f7b [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
jeffhaoe343b762011-12-05 16:36:44 -080016
17#ifndef ART_SRC_TRACE_H_
18#define ART_SRC_TRACE_H_
19
20#include <map>
jeffhaoa9ef3fd2011-12-13 18:33:43 -080021#include <ostream>
22#include <set>
23#include <string>
jeffhaoe343b762011-12-05 16:36:44 -080024
jeffhaoa9ef3fd2011-12-13 18:33:43 -080025#include "file.h"
jeffhaoe343b762011-12-05 16:36:44 -080026#include "globals.h"
27#include "macros.h"
jeffhao2692b572011-12-16 15:42:28 -080028#include "UniquePtr.h"
jeffhaoe343b762011-12-05 16:36:44 -080029
30namespace art {
31
32class Method;
jeffhaoa9ef3fd2011-12-13 18:33:43 -080033class Thread;
jeffhaoe343b762011-12-05 16:36:44 -080034
35struct TraceStackFrame {
36 TraceStackFrame(Method* method, uintptr_t return_pc)
37 : method_(method), return_pc_(return_pc) {
38 }
39
40 Method* method_;
41 uintptr_t return_pc_;
42};
43
44class Trace {
45 public:
jeffhaoa9ef3fd2011-12-13 18:33:43 -080046
47 enum TraceEvent {
48 kMethodTraceEnter = 0,
49 kMethodTraceExit = 1,
50 kMethodTraceUnwind = 2,
51 };
52
jeffhaoe343b762011-12-05 16:36:44 -080053 static void Start(const char* trace_filename, int trace_fd, int buffer_size, int flags, bool direct_to_ddms);
54 static void Stop();
55
jeffhao2692b572011-12-16 15:42:28 -080056 void LogMethodTraceEvent(Thread* self, const Method* method, TraceEvent event);
jeffhaoa9ef3fd2011-12-13 18:33:43 -080057
jeffhao2692b572011-12-16 15:42:28 -080058 void AddSavedCodeToMap(const Method* method, const void* code);
59 void RemoveSavedCodeFromMap(const Method* method);
60 const void* GetSavedCodeFromMap(const Method* method);
jeffhaoe343b762011-12-05 16:36:44 -080061
jeffhao2692b572011-12-16 15:42:28 -080062 void SaveAndUpdateCode(Method* method, const void* new_code);
63 void ResetSavedCode(Method* method);
jeffhaoe343b762011-12-05 16:36:44 -080064
65 private:
jeffhao2692b572011-12-16 15:42:28 -080066 explicit Trace(File* trace_file, int buffer_size)
67 : trace_file_(trace_file), buf_(new uint8_t[buffer_size]()), overflow_(false), buffer_size_(buffer_size),
68 start_time_(0), trace_version_(0), record_size_(0), cur_offset_(0) {
69 }
70
71 void BeginTracing();
72 void FinishTracing();
73
jeffhaoe343b762011-12-05 16:36:44 -080074 // Replaces code of each method with a pointer to a stub for method tracing.
jeffhao2692b572011-12-16 15:42:28 -080075 void InstallStubs();
jeffhaoe343b762011-12-05 16:36:44 -080076
77 // Restores original code for each method and fixes the return values of each thread's stack.
jeffhao2692b572011-12-16 15:42:28 -080078 void UninstallStubs();
jeffhaoe343b762011-12-05 16:36:44 -080079
jeffhaoa9ef3fd2011-12-13 18:33:43 -080080 // Methods to output traced methods and threads.
jeffhao2692b572011-12-16 15:42:28 -080081 void GetVisitedMethods(size_t end_offset);
82 void DumpMethodList(std::ostream& os);
83 void DumpThreadList(std::ostream& os);
jeffhaoa9ef3fd2011-12-13 18:33:43 -080084
jeffhao2692b572011-12-16 15:42:28 -080085 // Maps a method to its original code pointer.
86 std::map<const Method*, const void*> saved_code_map_;
jeffhaoe343b762011-12-05 16:36:44 -080087
jeffhao2692b572011-12-16 15:42:28 -080088 // Set of methods visited by the profiler.
89 std::set<const Method*> visited_methods_;
jeffhaoe343b762011-12-05 16:36:44 -080090
jeffhao2692b572011-12-16 15:42:28 -080091 // Maps a thread to its clock base.
92 std::map<Thread*, uint64_t> thread_clock_base_map_;
jeffhaoa9ef3fd2011-12-13 18:33:43 -080093
jeffhao2692b572011-12-16 15:42:28 -080094 // File to write trace data out to, NULL if direct to ddms.
95 UniquePtr<File> trace_file_;
jeffhaoa9ef3fd2011-12-13 18:33:43 -080096
jeffhao2692b572011-12-16 15:42:28 -080097 // Buffer to store trace data.
98 UniquePtr<uint8_t> buf_;
99
100 bool overflow_;
101 int buffer_size_;
102 uint64_t start_time_;
103 uint16_t trace_version_;
104 uint16_t record_size_;
105
106 volatile int32_t cur_offset_;
jeffhaoa9ef3fd2011-12-13 18:33:43 -0800107
jeffhaoe343b762011-12-05 16:36:44 -0800108 DISALLOW_COPY_AND_ASSIGN(Trace);
109};
110
111} // namespace art
112
113#endif // ART_SRC_TRACE_H_