|
13 | 13 | #define SANITIZER_STACKTRACE_PRINTER_H
|
14 | 14 |
|
15 | 15 | #include "sanitizer_common.h"
|
16 |
| -#include "sanitizer_internal_defs.h" |
17 | 16 | #include "sanitizer_symbolizer.h"
|
18 | 17 |
|
19 | 18 | namespace __sanitizer {
|
20 | 19 |
|
21 |
| -// StacktracePrinter is an interface that is implemented by |
22 |
| -// classes that can perform rendering of the different parts |
23 |
| -// of a stacktrace. |
24 |
| -class StackTracePrinter { |
25 |
| - public: |
26 |
| - static StackTracePrinter *GetOrInit(); |
27 |
| - |
28 |
| - virtual const char *StripFunctionName(const char *function) { |
29 |
| - UNIMPLEMENTED(); |
30 |
| - } |
31 |
| - |
32 |
| - virtual void RenderFrame(InternalScopedString *buffer, const char *format, |
33 |
| - int frame_no, uptr address, const AddressInfo *info, |
34 |
| - bool vs_style, const char *strip_path_prefix = "") { |
35 |
| - UNIMPLEMENTED(); |
36 |
| - } |
37 |
| - |
38 |
| - virtual bool RenderNeedsSymbolization(const char *format) { return false; } |
39 |
| - |
40 |
| - virtual void RenderSourceLocation(InternalScopedString *buffer, |
41 |
| - const char *file, int line, int column, |
42 |
| - bool vs_style, |
43 |
| - const char *strip_path_prefix) {} |
44 |
| - |
45 |
| - virtual void RenderModuleLocation(InternalScopedString *buffer, |
46 |
| - const char *module, uptr offset, |
47 |
| - ModuleArch arch, |
48 |
| - const char *strip_path_prefix) {} |
49 |
| - virtual void RenderData(InternalScopedString *buffer, const char *format, |
50 |
| - const DataInfo *DI, |
51 |
| - const char *strip_path_prefix = "") { |
52 |
| - UNIMPLEMENTED(); |
53 |
| - } |
54 |
| - |
55 |
| - protected: |
56 |
| - ~StackTracePrinter() {} |
57 |
| -}; |
58 |
| - |
59 |
| -class FormattedStackTracePrinter : public StackTracePrinter { |
60 |
| - public: |
61 |
| - // Strip interceptor prefixes from function name. |
62 |
| - const char *StripFunctionName(const char *function) override; |
63 |
| - |
64 |
| - // Render the contents of "info" structure, which represents the contents of |
65 |
| - // stack frame "frame_no" and appends it to the "buffer". "format" is a |
66 |
| - // string with placeholders, which is copied to the output with |
67 |
| - // placeholders substituted with the contents of "info". For example, |
68 |
| - // format string |
69 |
| - // " frame %n: function %F at %S" |
70 |
| - // will be turned into |
71 |
| - // " frame 10: function foo::bar() at my/file.cc:10" |
72 |
| - // You may additionally pass "strip_path_prefix" to strip prefixes of paths to |
73 |
| - // source files and modules. |
74 |
| - // Here's the full list of available placeholders: |
75 |
| - // %% - represents a '%' character; |
76 |
| - // %n - frame number (copy of frame_no); |
77 |
| - // %p - PC in hex format; |
78 |
| - // %m - path to module (binary or shared object); |
79 |
| - // %o - offset in the module in hex format; |
80 |
| - // %f - function name; |
81 |
| - // %q - offset in the function in hex format (*if available*); |
82 |
| - // %s - path to source file; |
83 |
| - // %l - line in the source file; |
84 |
| - // %c - column in the source file; |
85 |
| - // %F - if function is known to be <foo>, prints "in <foo>", possibly |
86 |
| - // followed by the offset in this function, but only if source file |
87 |
| - // is unknown; |
88 |
| - // %S - prints file/line/column information; |
89 |
| - // %L - prints location information: file/line/column, if it is known, or |
90 |
| - // module+offset if it is known, or (<unknown module>) string. |
91 |
| - // %M - prints module basename and offset, if it is known, or PC. |
92 |
| - void RenderFrame(InternalScopedString *buffer, const char *format, |
93 |
| - int frame_no, uptr address, const AddressInfo *info, |
94 |
| - bool vs_style, const char *strip_path_prefix = "") override; |
95 |
| - |
96 |
| - bool RenderNeedsSymbolization(const char *format) override; |
97 |
| - |
98 |
| - void RenderSourceLocation(InternalScopedString *buffer, const char *file, |
99 |
| - int line, int column, bool vs_style, |
100 |
| - const char *strip_path_prefix) override; |
101 |
| - |
102 |
| - void RenderModuleLocation(InternalScopedString *buffer, const char *module, |
103 |
| - uptr offset, ModuleArch arch, |
104 |
| - const char *strip_path_prefix) override; |
105 |
| - |
106 |
| - // Same as RenderFrame, but for data section (global variables). |
107 |
| - // Accepts %s, %l from above. |
108 |
| - // Also accepts: |
109 |
| - // %g - name of the global variable. |
110 |
| - void RenderData(InternalScopedString *buffer, const char *format, |
111 |
| - const DataInfo *DI, |
112 |
| - const char *strip_path_prefix = "") override; |
113 |
| - |
114 |
| - protected: |
115 |
| - ~FormattedStackTracePrinter() {} |
116 |
| -}; |
| 20 | +// Strip interceptor prefixes from function name. |
| 21 | +const char *StripFunctionName(const char *function); |
| 22 | + |
| 23 | +// Render the contents of "info" structure, which represents the contents of |
| 24 | +// stack frame "frame_no" and appends it to the "buffer". "format" is a |
| 25 | +// string with placeholders, which is copied to the output with |
| 26 | +// placeholders substituted with the contents of "info". For example, |
| 27 | +// format string |
| 28 | +// " frame %n: function %F at %S" |
| 29 | +// will be turned into |
| 30 | +// " frame 10: function foo::bar() at my/file.cc:10" |
| 31 | +// You may additionally pass "strip_path_prefix" to strip prefixes of paths to |
| 32 | +// source files and modules. |
| 33 | +// Here's the full list of available placeholders: |
| 34 | +// %% - represents a '%' character; |
| 35 | +// %n - frame number (copy of frame_no); |
| 36 | +// %p - PC in hex format; |
| 37 | +// %m - path to module (binary or shared object); |
| 38 | +// %o - offset in the module in hex format; |
| 39 | +// %f - function name; |
| 40 | +// %q - offset in the function in hex format (*if available*); |
| 41 | +// %s - path to source file; |
| 42 | +// %l - line in the source file; |
| 43 | +// %c - column in the source file; |
| 44 | +// %F - if function is known to be <foo>, prints "in <foo>", possibly |
| 45 | +// followed by the offset in this function, but only if source file |
| 46 | +// is unknown; |
| 47 | +// %S - prints file/line/column information; |
| 48 | +// %L - prints location information: file/line/column, if it is known, or |
| 49 | +// module+offset if it is known, or (<unknown module>) string. |
| 50 | +// %M - prints module basename and offset, if it is known, or PC. |
| 51 | +void RenderFrame(InternalScopedString *buffer, const char *format, int frame_no, |
| 52 | + uptr address, const AddressInfo *info, bool vs_style, |
| 53 | + const char *strip_path_prefix = ""); |
| 54 | + |
| 55 | +bool RenderNeedsSymbolization(const char *format); |
| 56 | + |
| 57 | +void RenderSourceLocation(InternalScopedString *buffer, const char *file, |
| 58 | + int line, int column, bool vs_style, |
| 59 | + const char *strip_path_prefix); |
| 60 | + |
| 61 | +void RenderModuleLocation(InternalScopedString *buffer, const char *module, |
| 62 | + uptr offset, ModuleArch arch, |
| 63 | + const char *strip_path_prefix); |
| 64 | + |
| 65 | +// Same as RenderFrame, but for data section (global variables). |
| 66 | +// Accepts %s, %l from above. |
| 67 | +// Also accepts: |
| 68 | +// %g - name of the global variable. |
| 69 | +void RenderData(InternalScopedString *buffer, const char *format, |
| 70 | + const DataInfo *DI, const char *strip_path_prefix = ""); |
117 | 71 |
|
118 | 72 | } // namespace __sanitizer
|
119 | 73 |
|
|
0 commit comments