diff options
| author | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-11 15:07:35 -0300 |
|---|---|---|
| committer | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-11 15:07:35 -0300 |
| commit | 4cb8841196d0625dfa3825aa326f071cd27c7b8b (patch) | |
| tree | 1682a647d4463397c119183369ae6f750d5fdcff /src/mongo/util/stacktrace_windows.cpp | |
| parent | aa03c6362cbaa767638e6eed9b031d86dd2643d1 (diff) | |
| parent | 8f0827553e09872941945a093b647a4211a9db7f (diff) | |
Update upstream source from tag 'upstream/6.0.0'master
Update to upstream version '6.0.0'
with Debian dir 5604a80ec1c96ca76f25f40d78e6ef855abec322
Diffstat (limited to 'src/mongo/util/stacktrace_windows.cpp')
| -rw-r--r-- | src/mongo/util/stacktrace_windows.cpp | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/src/mongo/util/stacktrace_windows.cpp b/src/mongo/util/stacktrace_windows.cpp index f34d616aa6a..99ceea9e937 100644 --- a/src/mongo/util/stacktrace_windows.cpp +++ b/src/mongo/util/stacktrace_windows.cpp @@ -66,6 +66,11 @@ namespace { const size_t kPathBufferSize = 1024; +struct Options { + bool withHumanReadable = false; + bool rawAddress = false; +}; + // On Windows the symbol handler must be initialized at process startup and cleaned up at shutdown. // This class wraps up that logic and gives access to the process handle associated with the // symbol handler. Because access to the symbol handler API is not thread-safe, it also provides @@ -207,11 +212,14 @@ struct TraceItem { std::pair<std::string, size_t> symbol; }; -void appendTrace(BSONObjBuilder* bob, const std::vector<TraceItem>& traceList) { +void appendTrace(BSONObjBuilder* bob, + const std::vector<TraceItem>& traceList, + const Options& options) { auto bt = BSONArrayBuilder(bob->subarrayStart("backtrace")); for (const auto& item : traceList) { auto o = BSONObjBuilder(bt.subobjStart()); - o.append("a", stack_trace_detail::Hex(item.address)); + if (options.rawAddress) + o.append("a", stack_trace_detail::Hex(item.address)); if (!item.module.empty()) o.append("module", item.module); if (!item.source.first.empty()) { @@ -286,51 +294,59 @@ std::vector<TraceItem> makeTraceList(CONTEXT& context) { return traceList; } -StackTrace getStackTraceImpl(CONTEXT& context) { - std::vector<TraceItem> traceList = makeTraceList(context); - if (traceList.empty()) { - return StackTrace(BSONObj(), ""); - } - +void printTraceList(const std::vector<TraceItem>& traceList, + StackTraceSink* sink, + const Options& options) { + using namespace fmt::literals; + if (traceList.empty()) + return; BSONObjBuilder bob; - appendTrace(&bob, traceList); - return StackTrace(bob.obj(), ""); + appendTrace(&bob, traceList, options); + stack_trace_detail::logBacktraceObject(bob.done(), sink, options.withHumanReadable); } -} // namespace -StackTrace getStackTrace() { +/** `sink` can be nullptr to emit structured logs instead of writing to a sink. */ +void printWindowsStackTraceImpl(CONTEXT& context, StackTraceSink* sink) { + Options options{}; + options.withHumanReadable = true; + options.rawAddress = true; + printTraceList(makeTraceList(context), sink, options); +} + +void printWindowsStackTraceImpl(StackTraceSink* sink) { CONTEXT context; memset(&context, 0, sizeof(context)); context.ContextFlags = CONTEXT_CONTROL; RtlCaptureContext(&context); - - return getStackTraceImpl(context); + printWindowsStackTraceImpl(context, sink); } +} // namespace + void printWindowsStackTrace(CONTEXT& context, StackTraceSink& sink) { - getStackTraceImpl(context).sink(&sink); + printWindowsStackTraceImpl(context, &sink); } void printWindowsStackTrace(CONTEXT& context, std::ostream& os) { OstreamStackTraceSink sink{os}; - printWindowsStackTrace(context, sink); + printWindowsStackTraceImpl(context, &sink); } void printWindowsStackTrace(CONTEXT& context) { - getStackTraceImpl(context).log(); + printWindowsStackTraceImpl(context, nullptr); } void printStackTrace(StackTraceSink& sink) { - getStackTrace().sink(&sink); + printWindowsStackTraceImpl(&sink); } void printStackTrace(std::ostream& os) { OstreamStackTraceSink sink{os}; - printStackTrace(sink); + printWindowsStackTraceImpl(&sink); } void printStackTrace() { - getStackTrace().log(); + printWindowsStackTraceImpl(nullptr); } } // namespace mongo |
