From 2f0e42ba8ddfea77c744f52fae7f1e09325cff1f Mon Sep 17 00:00:00 2001 From: Alastair Houghton Date: Wed, 7 Jun 2023 07:53:09 +0100 Subject: [PATCH 1/4] [Backtracing] Use stderr by default unless interactive. This means we don't need to specify `output-to` in CI. rdar://110371557 --- include/swift/Runtime/Backtrace.h | 1 + stdlib/public/runtime/Backtrace.cpp | 13 +++++++++++-- stdlib/public/runtime/CrashHandlerMacOS.cpp | 1 + test/lit.cfg | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/include/swift/Runtime/Backtrace.h b/include/swift/Runtime/Backtrace.h index 5cc468d1f0e19..38981d6694b7e 100644 --- a/include/swift/Runtime/Backtrace.h +++ b/include/swift/Runtime/Backtrace.h @@ -109,6 +109,7 @@ enum class SanitizePaths { }; enum class OutputTo { + Auto = -1, Stdout = 0, Stderr = 2, }; diff --git a/stdlib/public/runtime/Backtrace.cpp b/stdlib/public/runtime/Backtrace.cpp index caff824dc0221..b30a8866ad171 100644 --- a/stdlib/public/runtime/Backtrace.cpp +++ b/stdlib/public/runtime/Backtrace.cpp @@ -123,7 +123,7 @@ SWIFT_RUNTIME_STDLIB_INTERNAL BacktraceSettings _swift_backtraceSettings = { true, // outputTo, - OutputTo::Stdout, + OutputTo::Auto, // swiftBacktracePath NULL, @@ -322,6 +322,13 @@ BacktraceInitializer::BacktraceInitializer() { _swift_backtraceSettings.preset = Preset::Full; } + if (_swift_backtraceSettings.outputTo == OutputTo::Auto) { + if (_swift_backtraceSettings.interactive == OnOffTty::On) + _swift_backtraceSettings.outputTo = OutputTo::Stdout; + else + _swift_backtraceSettings.outputTo = OutputTo::Stderr; + } + #if !defined(SWIFT_RUNTIME_FIXED_BACKTRACER_PATH) if (_swift_backtraceSettings.enabled == OnOffTty::On && !_swift_backtraceSettings.swiftBacktracePath) { @@ -648,7 +655,9 @@ _swift_processBacktracingSetting(llvm::StringRef key, } else if (key.equals_insensitive("cache")) { _swift_backtraceSettings.cache = parseBoolean(value); } else if (key.equals_insensitive("output-to")) { - if (value.equals_insensitive("stdout")) + if (value.equals_insensitive("auto")) + _swift_backtraceSettings.outputTo = OutputTo::Auto; + else if (value.equals_insensitive("stdout")) _swift_backtraceSettings.outputTo = OutputTo::Stdout; else if (value.equals_insensitive("stderr")) _swift_backtraceSettings.outputTo = OutputTo::Stderr; diff --git a/stdlib/public/runtime/CrashHandlerMacOS.cpp b/stdlib/public/runtime/CrashHandlerMacOS.cpp index 505a7ba2c553b..cf3adad780b70 100644 --- a/stdlib/public/runtime/CrashHandlerMacOS.cpp +++ b/stdlib/public/runtime/CrashHandlerMacOS.cpp @@ -428,6 +428,7 @@ run_backtracer() case OutputTo::Stdout: backtracer_argv[30] = "stdout"; break; + case OutputTo::Auto: // Shouldn't happen, but if it does pick stderr case OutputTo::Stderr: backtracer_argv[30] = "stderr"; break; diff --git a/test/lit.cfg b/test/lit.cfg index da873e4085de7..05bf54c07f73f 100644 --- a/test/lit.cfg +++ b/test/lit.cfg @@ -494,7 +494,7 @@ if backtracing is not None: backtrace_on_crash = lit_config.params.get('backtrace_on_crash', None) if backtrace_on_crash is not None: - config.environment['SWIFT_BACKTRACE'] = 'enable=on,output-to=stderr' + config.environment['SWIFT_BACKTRACE'] = 'enable=on' config.available_features.add('lld_lto') From 210ca2a06732fbf318131eca92cdafca831d3af5 Mon Sep 17 00:00:00 2001 From: Alastair Houghton Date: Wed, 7 Jun 2023 09:12:03 +0100 Subject: [PATCH 2/4] [Backtracing][Tests] Fix tests to redirect output from stderr. Some of the backtracing tests expected output on stdout. rdar://110371557 --- test/Backtracing/Crash.swift | 8 ++++---- test/Backtracing/CrashAsync.swift | 4 ++-- test/Backtracing/CrashWithThunk.swift | 4 ++-- test/Backtracing/Overflow.swift | 4 ++-- test/Backtracing/StackOverflow.swift | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/test/Backtracing/Crash.swift b/test/Backtracing/Crash.swift index 4754968d0e630..6e1fef9b02f44 100644 --- a/test/Backtracing/Crash.swift +++ b/test/Backtracing/Crash.swift @@ -7,11 +7,11 @@ // RUN: %target-codesign %t/CrashNoDebug // RUN: %target-codesign %t/CrashOpt // RUN: %target-codesign %t/CrashOptNoDebug -// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/Crash || true) | %FileCheck %s +// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/Crash 2>&1 || true) | %FileCheck %s // RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,cache=no %target-run %t/Crash || true) | %FileCheck %s --check-prefix FRIENDLY -// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashNoDebug || true) | %FileCheck %s --check-prefix NODEBUG -// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashOpt || true) | %FileCheck %s --check-prefix OPTIMIZED -// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashOptNoDebug || true) | %FileCheck %s --check-prefix OPTNODEBUG +// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashNoDebug 2>&1 || true) | %FileCheck %s --check-prefix NODEBUG +// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashOpt 2>&1 || true) | %FileCheck %s --check-prefix OPTIMIZED +// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashOptNoDebug 2>&1 || true) | %FileCheck %s --check-prefix OPTNODEBUG // UNSUPPORTED: use_os_stdlib // UNSUPPORTED: back_deployment_runtime diff --git a/test/Backtracing/CrashAsync.swift b/test/Backtracing/CrashAsync.swift index c6b22ba50499b..e462129f9c25c 100644 --- a/test/Backtracing/CrashAsync.swift +++ b/test/Backtracing/CrashAsync.swift @@ -5,8 +5,8 @@ // Demangling is disabled for now because older macOS can't demangle async // function names. We test demangling elsewhere, so this is no big deal. -// RUN: (env SWIFT_BACKTRACE=enable=yes,demangle=no,cache=no %target-run %t/CrashAsync || true) | %FileCheck %s -// RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,demangle=no,cache=no %target-run %t/CrashAsync || true) | %FileCheck %s --check-prefix FRIENDLY +// RUN: (env SWIFT_BACKTRACE=enable=yes,demangle=no,cache=no %target-run %t/CrashAsync 2>&1 || true) | %FileCheck %s +// RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,demangle=no,cache=no %target-run %t/CrashAsync 2>&1 || true) | %FileCheck %s --check-prefix FRIENDLY // UNSUPPORTED: use_os_stdlib // UNSUPPORTED: back_deployment_runtime diff --git a/test/Backtracing/CrashWithThunk.swift b/test/Backtracing/CrashWithThunk.swift index 852fa52c420d4..b8beebf285dc9 100644 --- a/test/Backtracing/CrashWithThunk.swift +++ b/test/Backtracing/CrashWithThunk.swift @@ -1,8 +1,8 @@ // RUN: %empty-directory(%t) // RUN: %target-build-swift %s -parse-as-library -Onone -g -o %t/CrashWithThunk // RUN: %target-codesign %t/CrashWithThunk -// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashWithThunk || true) | %FileCheck %s -// RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,cache=no %target-run %t/CrashWithThunk || true) | %FileCheck %s --check-prefix FRIENDLY +// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashWithThunk 2>&1 || true) | %FileCheck %s +// RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,cache=no %target-run %t/CrashWithThunk 2>&1 || true) | %FileCheck %s --check-prefix FRIENDLY // UNSUPPORTED: use_os_stdlib // UNSUPPORTED: back_deployment_runtime diff --git a/test/Backtracing/Overflow.swift b/test/Backtracing/Overflow.swift index 8cda8cd587f4c..e9e5095274041 100644 --- a/test/Backtracing/Overflow.swift +++ b/test/Backtracing/Overflow.swift @@ -1,8 +1,8 @@ // RUN: %empty-directory(%t) // RUN: %target-build-swift %s -parse-as-library -Onone -g -o %t/Overflow // RUN: %target-codesign %t/Overflow -// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/Overflow || true) | %FileCheck %s -// RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,cache=no %target-run %t/Overflow || true) | %FileCheck %s --check-prefix FRIENDLY +// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/Overflow 2>&1 || true) | %FileCheck %s +// RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,cache=no %target-run %t/Overflow 2>&1 || true) | %FileCheck %s --check-prefix FRIENDLY // UNSUPPORTED: use_os_stdlib // UNSUPPORTED: back_deployment_runtime diff --git a/test/Backtracing/StackOverflow.swift b/test/Backtracing/StackOverflow.swift index f5b7f446c7bf4..d698f4e0c807f 100644 --- a/test/Backtracing/StackOverflow.swift +++ b/test/Backtracing/StackOverflow.swift @@ -1,9 +1,9 @@ // RUN: %empty-directory(%t) // RUN: %target-build-swift %s -parse-as-library -Onone -g -o %t/StackOverflow // RUN: %target-codesign %t/StackOverflow -// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/StackOverflow || true) | %FileCheck %s -// RUN: (env SWIFT_BACKTRACE=limit=17,top=5,enable=yes,cache=no %target-run %t/StackOverflow || true) | %FileCheck %s --check-prefix LIMITED -// RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,cache=no %target-run %t/StackOverflow || true) | %FileCheck %s --check-prefix FRIENDLY +// RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/StackOverflow 2>&1|| true) | %FileCheck %s +// RUN: (env SWIFT_BACKTRACE=limit=17,top=5,enable=yes,cache=no %target-run %t/StackOverflow 2>&1 || true) | %FileCheck %s --check-prefix LIMITED +// RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,cache=no %target-run %t/StackOverflow 2>&1 || true) | %FileCheck %s --check-prefix FRIENDLY // UNSUPPORTED: use_os_stdlib // UNSUPPORTED: back_deployment_runtime From 0b9747e77a747020ad205e4a355543b9c5bfc97d Mon Sep 17 00:00:00 2001 From: Alastair Houghton Date: Wed, 7 Jun 2023 09:18:42 +0100 Subject: [PATCH 3/4] [Backtracing] Also update the Linux crash handler, now it's merged. The Linux crash handler should have the same `output-to` behaviour as on macOS. rdar://110371557 --- stdlib/public/runtime/CrashHandlerLinux.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/stdlib/public/runtime/CrashHandlerLinux.cpp b/stdlib/public/runtime/CrashHandlerLinux.cpp index 2a7d6515e159b..4a7ae22432c40 100644 --- a/stdlib/public/runtime/CrashHandlerLinux.cpp +++ b/stdlib/public/runtime/CrashHandlerLinux.cpp @@ -617,6 +617,8 @@ const char *backtracer_argv[] = { "preset", // 26 "--cache", // 27 "true", // 28 + "--output-to", // 29 + "stdout", // 30 NULL }; @@ -769,6 +771,16 @@ run_backtracer(int memserver_fd) break; } + switch (_swift_backtraceSettings.outputTo) { + case OutputTo::Stdout: + backtracer_argv[30] = "stdout"; + break; + case OutputTo::Auto: // Shouldn't happen, but if it does pick stderr + case OutputTo::Stderr: + backtracer_argv[30] = "stderr"; + break; + } + backtracer_argv[28] = trueOrFalse(_swift_backtraceSettings.cache); format_unsigned(_swift_backtraceSettings.timeout, timeout_buf); From 646c2212c91114f29b2fbd8a68da37056a563b56 Mon Sep 17 00:00:00 2001 From: Alastair Houghton Date: Wed, 7 Jun 2023 10:22:43 +0100 Subject: [PATCH 4/4] [Backtracing][Tests] Fix a test I missed. Apparently I missed a redirection in `Crash.swift`. rdar://110371557 --- test/Backtracing/Crash.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Backtracing/Crash.swift b/test/Backtracing/Crash.swift index 6e1fef9b02f44..b818a1cbba3c2 100644 --- a/test/Backtracing/Crash.swift +++ b/test/Backtracing/Crash.swift @@ -8,7 +8,7 @@ // RUN: %target-codesign %t/CrashOpt // RUN: %target-codesign %t/CrashOptNoDebug // RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/Crash 2>&1 || true) | %FileCheck %s -// RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,cache=no %target-run %t/Crash || true) | %FileCheck %s --check-prefix FRIENDLY +// RUN: (env SWIFT_BACKTRACE=preset=friendly,enable=yes,cache=no %target-run %t/Crash 2>&1 || true) | %FileCheck %s --check-prefix FRIENDLY // RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashNoDebug 2>&1 || true) | %FileCheck %s --check-prefix NODEBUG // RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashOpt 2>&1 || true) | %FileCheck %s --check-prefix OPTIMIZED // RUN: (env SWIFT_BACKTRACE=enable=yes,cache=no %target-run %t/CrashOptNoDebug 2>&1 || true) | %FileCheck %s --check-prefix OPTNODEBUG