blob: 8dbf92495b72c86e555038ffa0ca3397cce846de [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
Ian Rogers57b86d42012-03-27 16:05:41 -070035uint32_t TraceMethodUnwindFromCode(Thread* self);
36
jeffhaoe343b762011-12-05 16:36:44 -080037struct TraceStackFrame {
38 TraceStackFrame(Method* method, uintptr_t return_pc)
39 : method_(method), return_pc_(return_pc) {
40 }
41
42 Method* method_;
43 uintptr_t return_pc_;
44};
45
46class Trace {
47 public:
jeffhaoa9ef3fd2011-12-13 18:33:43 -080048
49 enum TraceEvent {
50 kMethodTraceEnter = 0,
51 kMethodTraceExit = 1,
52 kMethodTraceUnwind = 2,
53 };
54
jeffhao0791adc2012-04-04 11:14:32 -070055 enum TraceFlag {
56 kTraceCountAllocs = 1,
57 };
58
jeffhaoe343b762011-12-05 16:36:44 -080059 static void Start(const char* trace_filename, int trace_fd, int buffer_size, int flags, bool direct_to_ddms);
60 static void Stop();
jeffhaob5e81852012-03-12 11:15:45 -070061 static void Shutdown();
jeffhaoe343b762011-12-05 16:36:44 -080062
jeffhao2692b572011-12-16 15:42:28 -080063 void LogMethodTraceEvent(Thread* self, const Method* method, TraceEvent event);
jeffhaoa9ef3fd2011-12-13 18:33:43 -080064
jeffhao2692b572011-12-16 15:42:28 -080065 void AddSavedCodeToMap(const Method* method, const void* code);
66 void RemoveSavedCodeFromMap(const Method* method);
67 const void* GetSavedCodeFromMap(const Method* method);
jeffhaoe343b762011-12-05 16:36:44 -080068
jeffhaob5e81852012-03-12 11:15:45 -070069 void SaveAndUpdateCode(Method* method);
jeffhao2692b572011-12-16 15:42:28 -080070 void ResetSavedCode(Method* method);
jeffhaoe343b762011-12-05 16:36:44 -080071
72 private:
jeffhao0791adc2012-04-04 11:14:32 -070073 explicit Trace(File* trace_file, int buffer_size, int flags)
74 : trace_file_(trace_file), buf_(new uint8_t[buffer_size]()), flags_(flags), overflow_(false),
75 buffer_size_(buffer_size), start_time_(0), trace_version_(0), record_size_(0), cur_offset_(0) {
jeffhao2692b572011-12-16 15:42:28 -080076 }
77
78 void BeginTracing();
79 void FinishTracing();
80
jeffhaoe343b762011-12-05 16:36:44 -080081 // Replaces code of each method with a pointer to a stub for method tracing.
jeffhao2692b572011-12-16 15:42:28 -080082 void InstallStubs();
jeffhaoe343b762011-12-05 16:36:44 -080083
84 // Restores original code for each method and fixes the return values of each thread's stack.
jeffhao2692b572011-12-16 15:42:28 -080085 void UninstallStubs();
jeffhaoe343b762011-12-05 16:36:44 -080086
jeffhaoa9ef3fd2011-12-13 18:33:43 -080087 // Methods to output traced methods and threads.
jeffhao2692b572011-12-16 15:42:28 -080088 void GetVisitedMethods(size_t end_offset);
89 void DumpMethodList(std::ostream& os);
90 void DumpThreadList(std::ostream& os);
jeffhaoa9ef3fd2011-12-13 18:33:43 -080091
jeffhao2692b572011-12-16 15:42:28 -080092 // Maps a method to its original code pointer.
93 std::map<const Method*, const void*> saved_code_map_;
jeffhaoe343b762011-12-05 16:36:44 -080094
jeffhao2692b572011-12-16 15:42:28 -080095 // Set of methods visited by the profiler.
96 std::set<const Method*> visited_methods_;
jeffhaoe343b762011-12-05 16:36:44 -080097
jeffhao2692b572011-12-16 15:42:28 -080098 // Maps a thread to its clock base.
99 std::map<Thread*, uint64_t> thread_clock_base_map_;
jeffhaoa9ef3fd2011-12-13 18:33:43 -0800100
jeffhao2692b572011-12-16 15:42:28 -0800101 // File to write trace data out to, NULL if direct to ddms.
102 UniquePtr<File> trace_file_;
jeffhaoa9ef3fd2011-12-13 18:33:43 -0800103
jeffhao2692b572011-12-16 15:42:28 -0800104 // Buffer to store trace data.
105 UniquePtr<uint8_t> buf_;
106
jeffhao0791adc2012-04-04 11:14:32 -0700107 // Flags enabling extra tracing of things such as alloc counts.
108 int flags_;
109
jeffhao2692b572011-12-16 15:42:28 -0800110 bool overflow_;
111 int buffer_size_;
112 uint64_t start_time_;
113 uint16_t trace_version_;
114 uint16_t record_size_;
115
116 volatile int32_t cur_offset_;
jeffhaoa9ef3fd2011-12-13 18:33:43 -0800117
jeffhaoe343b762011-12-05 16:36:44 -0800118 DISALLOW_COPY_AND_ASSIGN(Trace);
119};
120
121} // namespace art
122
123#endif // ART_SRC_TRACE_H_