summaryrefslogtreecommitdiff
path: root/src/mongo/util/stacktrace_windows.cpp
diff options
context:
space:
mode:
authorLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-11 15:07:35 -0300
committerLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-11 15:07:35 -0300
commit4cb8841196d0625dfa3825aa326f071cd27c7b8b (patch)
tree1682a647d4463397c119183369ae6f750d5fdcff /src/mongo/util/stacktrace_windows.cpp
parentaa03c6362cbaa767638e6eed9b031d86dd2643d1 (diff)
parent8f0827553e09872941945a093b647a4211a9db7f (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.cpp56
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