|  | // Copyright 2018 The Abseil Authors. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //      https://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  | // | 
|  | // ----------------------------------------------------------------------------- | 
|  | // File: symbolize.h | 
|  | // ----------------------------------------------------------------------------- | 
|  | // | 
|  | // This file configures the Abseil symbolizer for use in converting instruction | 
|  | // pointer addresses (program counters) into human-readable names (function | 
|  | // calls, etc.) within Abseil code. | 
|  | // | 
|  | // The symbolizer may be invoked from several sources: | 
|  | // | 
|  | //   * Implicitly, through the installation of an Abseil failure signal handler. | 
|  | //     (See failure_signal_handler.h for more information.) | 
|  | //   * By calling `Symbolize()` directly on a program counter you obtain through | 
|  | //     `absl::GetStackTrace()` or `absl::GetStackFrames()`. (See stacktrace.h | 
|  | //     for more information. | 
|  | //   * By calling `Symbolize()` directly on a program counter you obtain through | 
|  | //     other means (which would be platform-dependent). | 
|  | // | 
|  | // In all of the above cases, the symbolizer must first be initialized before | 
|  | // any program counter values can be symbolized. If you are installing a failure | 
|  | // signal handler, initialize the symbolizer before you do so. | 
|  | // | 
|  | // Example: | 
|  | // | 
|  | //   int main(int argc, char** argv) { | 
|  | //     // Initialize the Symbolizer before installing the failure signal handler | 
|  | //     absl::InitializeSymbolizer(argv[0]); | 
|  | // | 
|  | //     // Now you may install the failure signal handler | 
|  | //     absl::FailureSignalHandlerOptions options; | 
|  | //     absl::InstallFailureSignalHandler(options); | 
|  | // | 
|  | //     // Start running your main program | 
|  | //     ... | 
|  | //     return 0; | 
|  | //  } | 
|  | // | 
|  | #ifndef ABSL_DEBUGGING_SYMBOLIZE_H_ | 
|  | #define ABSL_DEBUGGING_SYMBOLIZE_H_ | 
|  |  | 
|  | #include "absl/debugging/internal/symbolize.h" | 
|  |  | 
|  | namespace absl { | 
|  | ABSL_NAMESPACE_BEGIN | 
|  |  | 
|  | // InitializeSymbolizer() | 
|  | // | 
|  | // Initializes the program counter symbolizer, given the path of the program | 
|  | // (typically obtained through `main()`s `argv[0]`). The Abseil symbolizer | 
|  | // allows you to read program counters (instruction pointer values) using their | 
|  | // human-readable names within output such as stack traces. | 
|  | // | 
|  | // Example: | 
|  | // | 
|  | // int main(int argc, char *argv[]) { | 
|  | //   absl::InitializeSymbolizer(argv[0]); | 
|  | //   // Now you can use the symbolizer | 
|  | // } | 
|  | void InitializeSymbolizer(const char* argv0); | 
|  | // | 
|  | // Symbolize() | 
|  | // | 
|  | // Symbolizes a program counter (instruction pointer value) `pc` and, on | 
|  | // success, writes the name to `out`. The symbol name is demangled, if possible. | 
|  | // Note that the symbolized name may be truncated and will be NUL-terminated. | 
|  | // Demangling is supported for symbols generated by GCC 3.x or newer). Returns | 
|  | // `false` on failure. | 
|  | // | 
|  | // Example: | 
|  | // | 
|  | //   // Print a program counter and its symbol name. | 
|  | //   static void DumpPCAndSymbol(void *pc) { | 
|  | //     char tmp[1024]; | 
|  | //     const char *symbol = "(unknown)"; | 
|  | //     if (absl::Symbolize(pc, tmp, sizeof(tmp))) { | 
|  | //       symbol = tmp; | 
|  | //     } | 
|  | //     absl::PrintF("%p  %s\n", pc, symbol); | 
|  | //  } | 
|  | bool Symbolize(const void *pc, char *out, int out_size); | 
|  |  | 
|  | ABSL_NAMESPACE_END | 
|  | }  // namespace absl | 
|  |  | 
|  | #endif  // ABSL_DEBUGGING_SYMBOLIZE_H_ |