Skip to content

Commit c7fa387

Browse files
committed
Record the last fatal error message for crash reporting on Windows
1 parent 311c55f commit c7fa387

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

include/swift/Runtime/Debug.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ static inline const char *CRGetCrashLogMessage() {
6060
SWIFT_RUNTIME_ATTRIBUTE_ALWAYS_INLINE
6161
static inline void CRSetCrashLogMessage(const char *) {}
6262

63+
#if defined(_WIN32)
64+
extern "C" {
65+
SWIFT_ATTRIBUTE_FOR_EXPORTS
66+
extern char* gLastFatalErrorMessage;
67+
}
68+
#endif // _WIN32
69+
6370
#endif
6471

6572
namespace swift {

stdlib/public/runtime/CrashReporter.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,10 @@ struct crashreporter_annotations_t gCRAnnotations __attribute__((
3333
}
3434

3535
#endif
36+
37+
#if defined(_WIN32)
38+
extern "C" {
39+
SWIFT_ATTRIBUTE_FOR_EXPORTS
40+
char* gLastFatalErrorMessage = nullptr;
41+
}
42+
#endif

stdlib/public/runtime/Errors.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@
7070
#include "swift/Runtime/Atomic.h"
7171
#endif // SWIFT_HAVE_CRASHREPORTERCLIENT
7272

73+
#if defined(_WIN32)
74+
#include "swift/Runtime/Atomic.h"
75+
#endif // _WIN32
76+
7377
#include "BacktracePrivate.h"
7478

7579
namespace FatalErrorFlags {
@@ -299,6 +303,34 @@ reportOnCrash(uint32_t flags, const char *message)
299303
#else
300304
// empty
301305
#endif // SWIFT_HAVE_CRASHREPORTERCLIENT
306+
307+
#if defined(_WIN32)
308+
// The last fatal error message is accessible for crash reporting on
309+
// Windows.
310+
char *oldMessage = nullptr;
311+
char *newMessage = nullptr;
312+
313+
oldMessage = std::atomic_load_explicit(
314+
(volatile std::atomic<char *> *)&gLastFatalErrorMessage,
315+
SWIFT_MEMORY_ORDER_CONSUME);
316+
317+
do {
318+
if (newMessage) {
319+
free(newMessage);
320+
newMessage = nullptr;
321+
}
322+
323+
if (oldMessage) {
324+
swift_asprintf(&newMessage, "%s%s", oldMessage, message);
325+
} else {
326+
newMessage = strdup(message);
327+
}
328+
} while (!std::atomic_compare_exchange_strong_explicit(
329+
(volatile std::atomic<char *> *)&gLastFatalErrorMessage,
330+
&oldMessage, newMessage,
331+
std::memory_order_release,
332+
SWIFT_MEMORY_ORDER_CONSUME));
333+
#endif // _WIN32
302334
}
303335

304336
// Report a message to system console and stderr.

0 commit comments

Comments
 (0)