trace.h revision a9ef3fd82bebc6370fc3ddbb094988feb6c83022
1// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_TRACE_H_
4#define ART_SRC_TRACE_H_
5
6#include <map>
7#include <ostream>
8#include <set>
9#include <string>
10
11#include "file.h"
12#include "globals.h"
13#include "macros.h"
14
15namespace art {
16
17class Method;
18class Thread;
19
20struct TraceStackFrame {
21  TraceStackFrame(Method* method, uintptr_t return_pc)
22      : method_(method), return_pc_(return_pc) {
23  }
24
25  Method* method_;
26  uintptr_t return_pc_;
27};
28
29class Trace {
30 public:
31
32  enum TraceEvent {
33    kMethodTraceEnter = 0,
34    kMethodTraceExit = 1,
35    kMethodTraceUnwind = 2,
36  };
37
38  static void Start(const char* trace_filename, int trace_fd, int buffer_size, int flags, bool direct_to_ddms);
39  static void Stop();
40
41  static void LogMethodTraceEvent(Thread* self, const Method* method, TraceEvent event);
42
43  static bool IsMethodTracingActive();
44  static void SetMethodTracingActive(bool value);
45
46  static void AddSavedCodeToMap(const Method* method, const void* code);
47  static void RemoveSavedCodeFromMap(const Method* method);
48  static const void* GetSavedCodeFromMap(const Method* method);
49
50  static void SaveAndUpdateCode(Method* method, const void* new_code);
51  static void ResetSavedCode(Method* method);
52
53 private:
54  // Replaces code of each method with a pointer to a stub for method tracing.
55  static void InstallStubs();
56
57  // Restores original code for each method and fixes the return values of each thread's stack.
58  static void UninstallStubs();
59
60  // Methods to output traced methods and threads.
61  static void GetVisitedMethods(size_t end_offset);
62  static void DumpMethodList(std::ostream& os);
63  static void DumpThreadList(std::ostream& os);
64
65  static bool method_tracing_active_;
66
67  // Maps a method to its original code pointer
68  static std::map<const Method*, const void*> saved_code_map_;
69
70  // Set of methods visited by the profiler
71  static std::set<const Method*> visited_methods_;
72
73  // Maps a thread to its clock base
74  static std::map<Thread*, uint64_t> thread_clock_base_map_;
75
76  static uint8_t* buf_;
77  static File* trace_file_;
78  static bool direct_to_ddms_;
79  static int buffer_size_;
80  static uint64_t start_time_;
81  static bool overflow_;
82  static uint16_t trace_version_;
83  static uint16_t record_size_;
84  static volatile int32_t cur_offset_;
85
86  DISALLOW_COPY_AND_ASSIGN(Trace);
87};
88
89}  // namespace art
90
91#endif  // ART_SRC_TRACE_H_
92