mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Linux gives the main thread a name based on the process name, and also we need to tolerate an extra slash on the `<compiler-generated>` filename for some reason. rdar://121430255
236 lines
8.2 KiB
Swift
236 lines
8.2 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-build-swift %s -parse-as-library -Onone -g -o %t/Crash
|
|
// RUN: %target-codesign %t/Crash
|
|
// RUN: env SWIFT_BACKTRACE=enable=yes,cache=no,format=json,output-to=%t/crash.json %target-run %t/Crash 2>&1 || true
|
|
// RUN: %validate-json %t/crash.json | %FileCheck %s
|
|
|
|
|
|
// Also check that we generate valid JSON with various different options set.
|
|
|
|
// RUN: env SWIFT_BACKTRACE=enable=yes,cache=no,format=json,output-to=%t/crash2.json,threads=crashed %target-run %t/Crash 2>&1 || true
|
|
// RUN: env SWIFT_BACKTRACE=enable=yes,cache=no,format=json,output-to=%t/crash3.json,registers=all %target-run %t/Crash 2>&1 || true
|
|
// RUN: env SWIFT_BACKTRACE=enable=yes,cache=no,format=json,output-to=%t/crash4.json,sanitize=yes %target-run %t/Crash 2>&1 || true
|
|
// RUN: env SWIFT_BACKTRACE=enable=yes,cache=no,format=json,output-to=%t/crash5.json,images=none %target-run %t/Crash 2>&1 || true
|
|
// RUN: env SWIFT_BACKTRACE=enable=yes,cache=no,format=json,output-to=%t/crash6.json,images=all %target-run %t/Crash 2>&1 || true
|
|
// RUN: env SWIFT_BACKTRACE=enable=yes,cache=no,format=json,output-to=%t/crash7.json,symbolicate=off %target-run %t/Crash 2>&1 || true
|
|
// RUN: env SWIFT_BACKTRACE=enable=yes,cache=no,format=json,output-to=%t/crash8.json,demangle=no %target-run %t/Crash 2>&1 || true
|
|
// RUN: %validate-json %t/crash2.json
|
|
// RUN: %validate-json %t/crash3.json
|
|
// RUN: %validate-json %t/crash4.json
|
|
// RUN: %validate-json %t/crash5.json
|
|
// RUN: %validate-json %t/crash6.json
|
|
// RUN: %validate-json %t/crash7.json
|
|
// RUN: %validate-json %t/crash8.json
|
|
|
|
// UNSUPPORTED: use_os_stdlib
|
|
// UNSUPPORTED: back_deployment_runtime
|
|
// UNSUPPORTED: asan
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: backtracing
|
|
// REQUIRES: OS=macosx || OS=linux-gnu
|
|
|
|
func level1() {
|
|
level2()
|
|
}
|
|
|
|
func level2() {
|
|
level3()
|
|
}
|
|
|
|
func level3() {
|
|
level4()
|
|
}
|
|
|
|
func level4() {
|
|
level5()
|
|
}
|
|
|
|
func level5() {
|
|
print("About to crash")
|
|
let ptr = UnsafeMutablePointer<Int>(bitPattern: 4)!
|
|
ptr.pointee = 42
|
|
}
|
|
|
|
@main
|
|
struct Crash {
|
|
static func main() {
|
|
level1()
|
|
}
|
|
}
|
|
|
|
// CHECK: {
|
|
|
|
// JSON logs start with an ISO timestamp
|
|
|
|
// CHECK-NEXT: "timestamp": "{{[0-9]{4,}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9]{6}Z}}",
|
|
|
|
|
|
// Then a tag identifying this as a crash report
|
|
|
|
// CHECK-NEXT: "kind": "crashReport",
|
|
|
|
|
|
// This is followed by a description and the fault address
|
|
|
|
// CHECK-NEXT: "description": "Bad pointer dereference",
|
|
// CHECK-NEXT: "faultAddress": "0x{{0+}}4",
|
|
|
|
|
|
// And then by the platform and architecture
|
|
// CHECK-NEXT: "platform": "{{.*}}",
|
|
// CHECK-NEXT: "architecture": "{{.*}}",
|
|
|
|
|
|
// And then a list of threads
|
|
|
|
// CHECK-NEXT: "threads": [
|
|
// CHECK-NEXT: {
|
|
|
|
// On Linux there's a name here
|
|
|
|
// CHECK: "crashed": true,
|
|
// CHECK-NEXT: "registers": {
|
|
// CHECK-NEXT: "{{.*}}": "0x{{[0-9a-f]+}}",
|
|
|
|
// More registers here, but the number is system specific
|
|
|
|
// CHECK: },
|
|
// CHECK-NEXT: "frames": [
|
|
// CHECK-NEXT: {
|
|
// CHECK-NEXT: "kind": "programCounter",
|
|
// CHECK-NEXT: "address": "0x{{[0-9a-f]+}}",
|
|
// CHECK-NEXT: "symbol": "{{_?}}$s5Crash6level5yyF",
|
|
// CHECK-NEXT: "offset": [[OFFSET:[0-9]+]],
|
|
// CHECK-NEXT: "description": "level5() + [[OFFSET]]",
|
|
// CHECK-NEXT: "image": "Crash",
|
|
// CHECK-NEXT: "sourceLocation": {
|
|
// CHECK-NEXT: "file": "{{.*}}/JSON.swift",
|
|
// CHECK-NEXT: "line": 51,
|
|
// CHECK-NEXT: "column": 15
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: },
|
|
// CHECK-NEXT: {
|
|
// CHECK-NEXT: "kind": "returnAddress",
|
|
// CHECK-NEXT: "address": "0x{{[0-9a-f]+}}",
|
|
// CHECK-NEXT: "symbol": "{{_?}}$s5Crash6level4yyF",
|
|
// CHECK-NEXT: "offset": [[OFFSET:[0-9]+]],
|
|
// CHECK-NEXT: "description": "level4() + [[OFFSET]]",
|
|
// CHECK-NEXT: "image": "Crash",
|
|
// CHECK-NEXT: "sourceLocation": {
|
|
// CHECK-NEXT: "file": "{{.*}}/JSON.swift",
|
|
// CHECK-NEXT: "line": 45,
|
|
// CHECK-NEXT: "column": 3
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: },
|
|
// CHECK-NEXT: {
|
|
// CHECK-NEXT: "kind": "returnAddress",
|
|
// CHECK-NEXT: "address": "0x{{[0-9a-f]+}}",
|
|
// CHECK-NEXT: "symbol": "{{_?}}$s5Crash6level3yyF",
|
|
// CHECK-NEXT: "offset": [[OFFSET:[0-9]+]],
|
|
// CHECK-NEXT: "description": "level3() + [[OFFSET]]",
|
|
// CHECK-NEXT: "image": "Crash",
|
|
// CHECK-NEXT: "sourceLocation": {
|
|
// CHECK-NEXT: "file": "{{.*}}/JSON.swift",
|
|
// CHECK-NEXT: "line": 41,
|
|
// CHECK-NEXT: "column": 3
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: },
|
|
// CHECK-NEXT: {
|
|
// CHECK-NEXT: "kind": "returnAddress",
|
|
// CHECK-NEXT: "address": "0x{{[0-9a-f]+}}",
|
|
// CHECK-NEXT: "symbol": "{{_?}}$s5Crash6level2yyF",
|
|
// CHECK-NEXT: "offset": [[OFFSET:[0-9]+]],
|
|
// CHECK-NEXT: "description": "level2() + [[OFFSET]]",
|
|
// CHECK-NEXT: "image": "Crash",
|
|
// CHECK-NEXT: "sourceLocation": {
|
|
// CHECK-NEXT: "file": "{{.*}}/JSON.swift",
|
|
// CHECK-NEXT: "line": 37,
|
|
// CHECK-NEXT: "column": 3
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: },
|
|
// CHECK-NEXT: {
|
|
// CHECK-NEXT: "kind": "returnAddress",
|
|
// CHECK-NEXT: "address": "0x{{[0-9a-f]+}}",
|
|
// CHECK-NEXT: "symbol": "{{_?}}$s5Crash6level1yyF",
|
|
// CHECK-NEXT: "offset": [[OFFSET:[0-9]+]],
|
|
// CHECK-NEXT: "description": "level1() + [[OFFSET]]",
|
|
// CHECK-NEXT: "image": "Crash",
|
|
// CHECK-NEXT: "sourceLocation": {
|
|
// CHECK-NEXT: "file": "{{.*}}/JSON.swift",
|
|
// CHECK-NEXT: "line": 33,
|
|
// CHECK-NEXT: "column": 3
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: },
|
|
// CHECK-NEXT: {
|
|
// CHECK-NEXT: "kind": "returnAddress",
|
|
// CHECK-NEXT: "address": "0x{{[0-9a-f]+}}",
|
|
// CHECK-NEXT: "symbol": "{{_?}}$s5CrashAAV4mainyyFZ",
|
|
// CHECK-NEXT: "offset": [[OFFSET:[0-9]+]],
|
|
// CHECK-NEXT: "description": "static Crash.main() + [[OFFSET]]",
|
|
// CHECK-NEXT: "image": "Crash",
|
|
// CHECK-NEXT: "sourceLocation": {
|
|
// CHECK-NEXT: "file": "{{.*}}/JSON.swift",
|
|
// CHECK-NEXT: "line": 57,
|
|
// CHECK-NEXT: "column": 5
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: },
|
|
// CHECK-NEXT: {
|
|
// CHECK-NEXT: "kind": "returnAddress",
|
|
// CHECK-NEXT: "address": "0x{{[0-9a-f]+}}",
|
|
// CHECK-NEXT: "system": true,
|
|
// CHECK-NEXT: "symbol": "{{_?}}$s5CrashAAV5$mainyyFZ",
|
|
// CHECK-NEXT: "offset": [[OFFSET:[0-9]+]],
|
|
// CHECK-NEXT: "description": "static Crash.$main() + [[OFFSET]]",
|
|
// CHECK-NEXT: "image": "Crash",
|
|
// CHECK-NEXT: "sourceLocation": {
|
|
// CHECK-NEXT: "file": "{{/*}}<compiler-generated>",
|
|
// CHECK-NEXT: "line": 0,
|
|
// CHECK-NEXT: "column": 0
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: },
|
|
// CHECK-NEXT: {
|
|
// CHECK-NEXT: "kind": "returnAddress",
|
|
// CHECK-NEXT: "address": "0x{{[0-9a-f]+}}",
|
|
// CHECK-NEXT: "system": true,
|
|
// CHECK-NEXT: "symbol": "{{_?main}}",
|
|
// CHECK-NEXT: "offset": [[OFFSET:[0-9]+]],
|
|
// CHECK-NEXT: "description": "main + [[OFFSET]]",
|
|
// CHECK-NEXT: "image": "Crash",
|
|
// CHECK-NEXT: "sourceLocation": {
|
|
// CHECK-NEXT: "file": "{{.*}}/JSON.swift",
|
|
// CHECK-NEXT: "line": 0,
|
|
// CHECK-NEXT: "column": 0
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: },
|
|
|
|
// More frames here, but they're system specific
|
|
|
|
// CHECK: ]
|
|
// CHECK: }
|
|
// CHECK-NEXT: ],
|
|
// CHECK-NEXT: "capturedMemory": {
|
|
// CHECK-NEXT: "0x{{[[0-9a-f]+}}": "{{([0-9a-f][0-9a-f])+}}",
|
|
|
|
// More captures here, but system specific
|
|
|
|
// CHECK: },
|
|
// CHECK-NEXT: "omittedImages": {{[0-9]+}},
|
|
// CHECK-NEXT: "images": [
|
|
// CHECK-NEXT: {
|
|
|
|
// Maybe multiple images before this one
|
|
|
|
// CHECK: "name": "Crash",
|
|
// "buildId": ... is optional
|
|
// CHECK: "path": "{{.*}}/Crash",
|
|
// CHECK-NEXT: "baseAddress": "0x{{[0-9a-f]+}}",
|
|
// CHECK-NEXT: "endOfText": "0x{{[0-9a-f]+}}"
|
|
// CHECK-NEXT: }
|
|
|
|
// Maybe multiple images after this one
|
|
|
|
// CHECK: ],
|
|
// CHECK-NEXT: "backtraceTime": {{[0-9]+(\.[0-9]+)?}}
|
|
|
|
// CHECK-NEXT: }
|