1*9356374aSAndroid Build Coastguard Worker // Copyright 2018 The Abseil Authors. 2*9356374aSAndroid Build Coastguard Worker // 3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*9356374aSAndroid Build Coastguard Worker // 7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*9356374aSAndroid Build Coastguard Worker // 9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*9356374aSAndroid Build Coastguard Worker // limitations under the License. 14*9356374aSAndroid Build Coastguard Worker // 15*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 16*9356374aSAndroid Build Coastguard Worker // File: symbolize.h 17*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 18*9356374aSAndroid Build Coastguard Worker // 19*9356374aSAndroid Build Coastguard Worker // This file configures the Abseil symbolizer for use in converting instruction 20*9356374aSAndroid Build Coastguard Worker // pointer addresses (program counters) into human-readable names (function 21*9356374aSAndroid Build Coastguard Worker // calls, etc.) within Abseil code. 22*9356374aSAndroid Build Coastguard Worker // 23*9356374aSAndroid Build Coastguard Worker // The symbolizer may be invoked from several sources: 24*9356374aSAndroid Build Coastguard Worker // 25*9356374aSAndroid Build Coastguard Worker // * Implicitly, through the installation of an Abseil failure signal handler. 26*9356374aSAndroid Build Coastguard Worker // (See failure_signal_handler.h for more information.) 27*9356374aSAndroid Build Coastguard Worker // * By calling `Symbolize()` directly on a program counter you obtain through 28*9356374aSAndroid Build Coastguard Worker // `absl::GetStackTrace()` or `absl::GetStackFrames()`. (See stacktrace.h 29*9356374aSAndroid Build Coastguard Worker // for more information. 30*9356374aSAndroid Build Coastguard Worker // * By calling `Symbolize()` directly on a program counter you obtain through 31*9356374aSAndroid Build Coastguard Worker // other means (which would be platform-dependent). 32*9356374aSAndroid Build Coastguard Worker // 33*9356374aSAndroid Build Coastguard Worker // In all of the above cases, the symbolizer must first be initialized before 34*9356374aSAndroid Build Coastguard Worker // any program counter values can be symbolized. If you are installing a failure 35*9356374aSAndroid Build Coastguard Worker // signal handler, initialize the symbolizer before you do so. 36*9356374aSAndroid Build Coastguard Worker // 37*9356374aSAndroid Build Coastguard Worker // Example: 38*9356374aSAndroid Build Coastguard Worker // 39*9356374aSAndroid Build Coastguard Worker // int main(int argc, char** argv) { 40*9356374aSAndroid Build Coastguard Worker // // Initialize the Symbolizer before installing the failure signal handler 41*9356374aSAndroid Build Coastguard Worker // absl::InitializeSymbolizer(argv[0]); 42*9356374aSAndroid Build Coastguard Worker // 43*9356374aSAndroid Build Coastguard Worker // // Now you may install the failure signal handler 44*9356374aSAndroid Build Coastguard Worker // absl::FailureSignalHandlerOptions options; 45*9356374aSAndroid Build Coastguard Worker // absl::InstallFailureSignalHandler(options); 46*9356374aSAndroid Build Coastguard Worker // 47*9356374aSAndroid Build Coastguard Worker // // Start running your main program 48*9356374aSAndroid Build Coastguard Worker // ... 49*9356374aSAndroid Build Coastguard Worker // return 0; 50*9356374aSAndroid Build Coastguard Worker // } 51*9356374aSAndroid Build Coastguard Worker // 52*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_DEBUGGING_SYMBOLIZE_H_ 53*9356374aSAndroid Build Coastguard Worker #define ABSL_DEBUGGING_SYMBOLIZE_H_ 54*9356374aSAndroid Build Coastguard Worker 55*9356374aSAndroid Build Coastguard Worker #include "absl/debugging/internal/symbolize.h" 56*9356374aSAndroid Build Coastguard Worker 57*9356374aSAndroid Build Coastguard Worker namespace absl { 58*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN 59*9356374aSAndroid Build Coastguard Worker 60*9356374aSAndroid Build Coastguard Worker // InitializeSymbolizer() 61*9356374aSAndroid Build Coastguard Worker // 62*9356374aSAndroid Build Coastguard Worker // Initializes the program counter symbolizer, given the path of the program 63*9356374aSAndroid Build Coastguard Worker // (typically obtained through `main()`s `argv[0]`). The Abseil symbolizer 64*9356374aSAndroid Build Coastguard Worker // allows you to read program counters (instruction pointer values) using their 65*9356374aSAndroid Build Coastguard Worker // human-readable names within output such as stack traces. 66*9356374aSAndroid Build Coastguard Worker // 67*9356374aSAndroid Build Coastguard Worker // Example: 68*9356374aSAndroid Build Coastguard Worker // 69*9356374aSAndroid Build Coastguard Worker // int main(int argc, char *argv[]) { 70*9356374aSAndroid Build Coastguard Worker // absl::InitializeSymbolizer(argv[0]); 71*9356374aSAndroid Build Coastguard Worker // // Now you can use the symbolizer 72*9356374aSAndroid Build Coastguard Worker // } 73*9356374aSAndroid Build Coastguard Worker void InitializeSymbolizer(const char* argv0); 74*9356374aSAndroid Build Coastguard Worker // 75*9356374aSAndroid Build Coastguard Worker // Symbolize() 76*9356374aSAndroid Build Coastguard Worker // 77*9356374aSAndroid Build Coastguard Worker // Symbolizes a program counter (instruction pointer value) `pc` and, on 78*9356374aSAndroid Build Coastguard Worker // success, writes the name to `out`. The symbol name is demangled, if possible. 79*9356374aSAndroid Build Coastguard Worker // Note that the symbolized name may be truncated and will be NUL-terminated. 80*9356374aSAndroid Build Coastguard Worker // Demangling is supported for symbols generated by GCC 3.x or newer). Returns 81*9356374aSAndroid Build Coastguard Worker // `false` on failure. 82*9356374aSAndroid Build Coastguard Worker // 83*9356374aSAndroid Build Coastguard Worker // Example: 84*9356374aSAndroid Build Coastguard Worker // 85*9356374aSAndroid Build Coastguard Worker // // Print a program counter and its symbol name. 86*9356374aSAndroid Build Coastguard Worker // static void DumpPCAndSymbol(void *pc) { 87*9356374aSAndroid Build Coastguard Worker // char tmp[1024]; 88*9356374aSAndroid Build Coastguard Worker // const char *symbol = "(unknown)"; 89*9356374aSAndroid Build Coastguard Worker // if (absl::Symbolize(pc, tmp, sizeof(tmp))) { 90*9356374aSAndroid Build Coastguard Worker // symbol = tmp; 91*9356374aSAndroid Build Coastguard Worker // } 92*9356374aSAndroid Build Coastguard Worker // absl::PrintF("%p %s\n", pc, symbol); 93*9356374aSAndroid Build Coastguard Worker // } 94*9356374aSAndroid Build Coastguard Worker bool Symbolize(const void *pc, char *out, int out_size); 95*9356374aSAndroid Build Coastguard Worker 96*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END 97*9356374aSAndroid Build Coastguard Worker } // namespace absl 98*9356374aSAndroid Build Coastguard Worker 99*9356374aSAndroid Build Coastguard Worker #endif // ABSL_DEBUGGING_SYMBOLIZE_H_ 100