blob: d545b14f52ae7918e353f16ad0d892f54b01feac [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();
jeffhaob5e81852012-03-12 11:15:45 -070055 static void Shutdown();
jeffhaoe343b762011-12-05 16:36:44 -080056
jeffhao2692b572011-12-16 15:42:28 -080057 void LogMethodTraceEvent(Thread* self, const Method* method, TraceEvent event);
jeffhaoa9ef3fd2011-12-13 18:33:43 -080058
jeffhao2692b572011-12-16 15:42:28 -080059 void AddSavedCodeToMap(const Method* method, const void* code);
60 void RemoveSavedCodeFromMap(const Method* method);
61 const void* GetSavedCodeFromMap(const Method* method);
jeffhaoe343b762011-12-05 16:36:44 -080062
jeffhaob5e81852012-03-12 11:15:45 -070063 void SaveAndUpdateCode(Method* method);
jeffhao2692b572011-12-16 15:42:28 -080064 void ResetSavedCode(Method* method);
jeffhaoe343b762011-12-05 16:36:44 -080065
66 private:
jeffhao2692b572011-12-16 15:42:28 -080067 explicit Trace(File* trace_file, int buffer_size)
68 : trace_file_(trace_file), buf_(new uint8_t[buffer_size]()), overflow_(false), buffer_size_(buffer_size),
69 start_time_(0), trace_version_(0), record_size_(0), cur_offset_(0) {
70 }
71
72 void BeginTracing();
73 void FinishTracing();
74
jeffhaoe343b762011-12-05 16:36:44 -080075 // Replaces code of each method with a pointer to a stub for method tracing.
jeffhao2692b572011-12-16 15:42:28 -080076 void InstallStubs();
jeffhaoe343b762011-12-05 16:36:44 -080077
78 // Restores original code for each method and fixes the return values of each thread's stack.
jeffhao2692b572011-12-16 15:42:28 -080079 void UninstallStubs();
jeffhaoe343b762011-12-05 16:36:44 -080080
jeffhaoa9ef3fd2011-12-13 18:33:43 -080081 // Methods to output traced methods and threads.
jeffhao2692b572011-12-16 15:42:28 -080082 void GetVisitedMethods(size_t end_offset);
83 void DumpMethodList(std::ostream& os);
84 void DumpThreadList(std::ostream& os);
jeffhaoa9ef3fd2011-12-13 18:33:43 -080085
jeffhao2692b572011-12-16 15:42:28 -080086 // Maps a method to its original code pointer.
87 std::map<const Method*, const void*> saved_code_map_;
jeffhaoe343b762011-12-05 16:36:44 -080088
jeffhao2692b572011-12-16 15:42:28 -080089 // Set of methods visited by the profiler.
90 std::set<const Method*> visited_methods_;
jeffhaoe343b762011-12-05 16:36:44 -080091
jeffhao2692b572011-12-16 15:42:28 -080092 // Maps a thread to its clock base.
93 std::map<Thread*, uint64_t> thread_clock_base_map_;
jeffhaoa9ef3fd2011-12-13 18:33:43 -080094
jeffhao2692b572011-12-16 15:42:28 -080095 // File to write trace data out to, NULL if direct to ddms.
96 UniquePtr<File> trace_file_;
jeffhaoa9ef3fd2011-12-13 18:33:43 -080097
jeffhao2692b572011-12-16 15:42:28 -080098 // Buffer to store trace data.
99 UniquePtr<uint8_t> buf_;
100
101 bool overflow_;
102 int buffer_size_;
103 uint64_t start_time_;
104 uint16_t trace_version_;
105 uint16_t record_size_;
106
107 volatile int32_t cur_offset_;
jeffhaoa9ef3fd2011-12-13 18:33:43 -0800108
jeffhaoe343b762011-12-05 16:36:44 -0800109 DISALLOW_COPY_AND_ASSIGN(Trace);
110};
111
112} // namespace art
113
114#endif // ART_SRC_TRACE_H_