Skip to content

Commit f15011f

Browse files
committed
[Backtracing] Tweak output slightly.
Fixed the colours so that they work with all of the default Terminal presets. Also changed things so that when colour is off, we only use ASCII characters in our source code displays. rdar://105452194
1 parent 65a6aae commit f15011f

File tree

5 files changed

+101
-92
lines changed

5 files changed

+101
-92
lines changed

stdlib/public/Backtracing/BacktraceFormatter.swift

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ public protocol BacktraceFormattingTheme {
3838
func sourceLocation(_ s: String) -> String
3939
func lineNumber(_ s: String) -> String
4040
func code(_ s: String) -> String
41+
func crashedLineNumber(_ s: String) -> String
4142
func crashedLine(_ s: String) -> String
42-
func crashLocation(_ s: String) -> String
43+
func crashLocation() -> String
4344
func imageName(_ s: String) -> String
4445
func imageAddressRange(_ s: String) -> String
4546
func imageBuildID(_ s: String) -> String
@@ -53,10 +54,11 @@ extension BacktraceFormattingTheme {
5354
public func symbol(_ s: String) -> String { return s }
5455
public func offset(_ s: String) -> String { return s }
5556
public func sourceLocation(_ s: String) -> String { return s }
56-
public func lineNumber(_ s: String) -> String { return s }
57+
public func lineNumber(_ s: String) -> String { return " \(s)|" }
5758
public func code(_ s: String) -> String { return s }
59+
public func crashedLineNumber(_ s: String) -> String { return "*\(s)|" }
5860
public func crashedLine(_ s: String) -> String { return s }
59-
public func crashLocation(_ s: String) -> String { return s }
61+
public func crashLocation() -> String { return "^" }
6062
public func imageName(_ s: String) -> String { return s }
6163
public func imageAddressRange(_ s: String) -> String { return s }
6264
public func imageBuildID(_ s: String) -> String { return s }
@@ -638,16 +640,19 @@ public struct BacktraceFormatter {
638640
&& line <= sourceLocation.line + options._sourceContextLines {
639641
let untabified = untabify(sourceLine)
640642
let code = options._theme.code(untabified)
641-
let lineNumber = options._theme.lineNumber(pad("\(line)",
642-
to: maxLineWidth,
643-
aligned: .right))
644643
let theLine: String
645644
if line == sourceLocation.line {
645+
let lineNumber = options._theme.crashedLineNumber(pad("\(line)",
646+
to: maxLineWidth,
647+
aligned: .right))
646648
let highlightWidth = options._width - 2 * theIndent
647-
theLine = options._theme.crashedLine(pad("\(lineNumber) \(code) ",
649+
theLine = options._theme.crashedLine(pad("\(lineNumber) \(code)",
648650
to: highlightWidth))
649651
} else {
650-
theLine = "\(lineNumber)\(code)"
652+
let lineNumber = options._theme.lineNumber(pad("\(line)",
653+
to: maxLineWidth,
654+
aligned: .right))
655+
theLine = "\(lineNumber) \(code)"
651656
}
652657
lines.append("\(indent)\(theLine)")
653658

@@ -676,10 +681,11 @@ public struct BacktraceFormatter {
676681
let pad = String(repeating: " ",
677682
count: max(terminalWidth - 1, 0))
678683

679-
let marker = options._theme.crashLocation("")
680-
let blankForNumber = String(repeating: " ", count: maxLineWidth)
684+
let marker = options._theme.crashLocation()
685+
let blankForNumber = options._theme.lineNumber(
686+
String(repeating: " ", count: maxLineWidth))
681687

682-
lines.append("\(indent)\(blankForNumber) \(pad)\(marker)")
688+
lines.append("\(indent)\(blankForNumber) \(pad)\(marker)")
683689
}
684690
}
685691
}

stdlib/public/libexec/swift-backtrace/Themes.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,19 @@ enum Themes {
9595
return "\(fg: .yellow)\(s)\(fg: .normal)"
9696
}
9797
public func lineNumber(_ s: String) -> String {
98-
return "\(fg: .gray)\(s)\(fg: .normal)"
98+
return "\(fg: .gray)\(s)\(fg: .normal)"
9999
}
100100
public func code(_ s: String) -> String {
101101
return "\(s)"
102102
}
103+
public func crashedLineNumber(_ s: String) -> String {
104+
return "\(fg: .gray)\(s)\(fg: .brightWhite)"
105+
}
103106
public func crashedLine(_ s: String) -> String {
104-
return "\(bg: .grayscale(2))\(s)\(bg: .normal)"
107+
return "\(bg: .grayscale(2))\(fg: .brightWhite)\(s)\(fg: .normal)\(bg: .normal)"
105108
}
106-
public func crashLocation(_ s: String) -> String {
107-
return "\(fg: .brightRed)\(s)\(fg: .normal)"
109+
public func crashLocation() -> String {
110+
return "\(fg: .brightRed)\(fg: .normal)"
108111
}
109112
public func imageName(_ s: String) -> String {
110113
return "\(fg: .cyan)\(s)\(fg: .normal)"

test/Backtracing/Crash.swift

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -71,57 +71,57 @@ struct Crash {
7171

7272
// FRIENDLY: 0 level5() + {{[0-9]+}} in Crash at {{.*}}/Crash.swift:38:15
7373

74-
// FRIENDLY: 36 print("About to crash")
75-
// FRIENDLY-NEXT: 37 let ptr = UnsafeMutablePointer<Int>(bitPattern: 4)!
76-
// FRIENDLY-NEXT: 38 ptr.pointee = 42
77-
// FRIENDLY-NEXT:
78-
// FRIENDLY-NEXT: 39 }
79-
// FRIENDLY-NEXT: 40
74+
// FRIENDLY: 36| print("About to crash")
75+
// FRIENDLY-NEXT: 37| let ptr = UnsafeMutablePointer<Int>(bitPattern: 4)!
76+
// FRIENDLY-NEXT: 38| ptr.pointee = 42
77+
// FRIENDLY-NEXT: | ^
78+
// FRIENDLY-NEXT: 39| }
79+
// FRIENDLY-NEXT: 40|
8080

8181
// FRIENDLY: 1 level4() + {{[0-9]+}} in Crash at {{.*}}/Crash.swift:32:3
8282

83-
// FRIENDLY: 30
84-
// FRIENDLY-NEXT: 31 func level4() {
85-
// FRIENDLY-NEXT: 32 level5()
86-
// FRIENDLY-NEXT:
87-
// FRIENDLY-NEXT: 33 }
88-
// FRIENDLY-NEXT: 34
83+
// FRIENDLY: 30|
84+
// FRIENDLY-NEXT: 31| func level4() {
85+
// FRIENDLY-NEXT: 32| level5()
86+
// FRIENDLY-NEXT: | ^
87+
// FRIENDLY-NEXT: 33| }
88+
// FRIENDLY-NEXT: 34|
8989

9090
// FRIENDLY: 2 level3() + {{[0-9]+}} in Crash at {{.*}}/Crash.swift:28:3
9191

92-
// FRIENDLY: 26
93-
// FRIENDLY-NEXT: 27 func level3() {
94-
// FRIENDLY-NEXT: 28 level4()
95-
// FRIENDLY-NEXT:
96-
// FRIENDLY-NEXT: 29 }
97-
// FRIENDLY-NEXT: 30
92+
// FRIENDLY: 26|
93+
// FRIENDLY-NEXT: 27| func level3() {
94+
// FRIENDLY-NEXT: 28| level4()
95+
// FRIENDLY-NEXT: | ^
96+
// FRIENDLY-NEXT: 29| }
97+
// FRIENDLY-NEXT: 30|
9898

9999
// FRIENDLY: 3 level2() + {{[0-9]+}} in Crash at {{.*}}/Crash.swift:24:3
100100

101-
// FRIENDLY: 22
102-
// FRIENDLY-NEXT: 23 func level2() {
103-
// FRIENDLY-NEXT: 24 level3()
104-
// FRIENDLY-NEXT:
105-
// FRIENDLY-NEXT: 25 }
106-
// FRIENDLY-NEXT: 26
101+
// FRIENDLY: 22|
102+
// FRIENDLY-NEXT: 23| func level2() {
103+
// FRIENDLY-NEXT: 24| level3()
104+
// FRIENDLY-NEXT: | ^
105+
// FRIENDLY-NEXT: 25| }
106+
// FRIENDLY-NEXT: 26|
107107

108108
// FRIENDLY: 4 level1() + {{[0-9]+}} in Crash at {{.*}}/Crash.swift:20:3
109109

110-
// FRIENDLY: 18
111-
// FRIENDLY-NEXT: 19 func level1() {
112-
// FRIENDLY-NEXT: 20 level2()
113-
// FRIENDLY-NEXT:
114-
// FRIENDLY-NEXT: 21 }
115-
// FRIENDLY-NEXT: 22
110+
// FRIENDLY: 18|
111+
// FRIENDLY-NEXT: 19| func level1() {
112+
// FRIENDLY-NEXT: 20| level2()
113+
// FRIENDLY-NEXT: | ^
114+
// FRIENDLY-NEXT: 21| }
115+
// FRIENDLY-NEXT: 22|
116116

117117
// FRIENDLY: 5 static Crash.main() + {{[0-9]+}} in Crash at {{.*}}/Crash.swift:44:5
118118

119-
// FRIENDLY: 42 struct Crash {
120-
// FRIENDLY-NEXT: 43 static func main() {
121-
// FRIENDLY-NEXT: 44 level1()
122-
// FRIENDLY-NEXT:
123-
// FRIENDLY-NEXT: 45 }
124-
// FRIENDLY-NEXT: 46 }
119+
// FRIENDLY: 42| struct Crash {
120+
// FRIENDLY-NEXT: 43| static func main() {
121+
// FRIENDLY-NEXT: 44| level1()
122+
// FRIENDLY-NEXT: | ^
123+
// FRIENDLY-NEXT: 45| }
124+
// FRIENDLY-NEXT: 46| }
125125

126126
// NODEBUG: *** Program crashed: Bad pointer dereference at 0x{{0*}}4 ***
127127

test/Backtracing/CrashWithThunk.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,18 @@ struct CrashWithThunk {
4949

5050
// FRIENDLY: 0 crash() + {{[0-9]+}} in CrashWithThunk at {{.*}}/CrashWithThunk.swift:17:15
5151

52-
// FRIENDLY: 15 print("I'm going to crash here")
53-
// FRIENDLY-NEXT: 16 let ptr = UnsafeMutablePointer<Int>(bitPattern: 4)!
54-
// FRIENDLY-NEXT: 17 ptr.pointee = 42
55-
// FRIENDLY-NEXT:
56-
// FRIENDLY-NEXT: 18 }
57-
// FRIENDLY-NEXT: 19
52+
// FRIENDLY: 15| print("I'm going to crash here")
53+
// FRIENDLY-NEXT: 16| let ptr = UnsafeMutablePointer<Int>(bitPattern: 4)!
54+
// FRIENDLY-NEXT: 17| ptr.pointee = 42
55+
// FRIENDLY-NEXT: | ^
56+
// FRIENDLY-NEXT: 18| }
57+
// FRIENDLY-NEXT: 19|
5858

5959
// FRIENDLY: 1 static CrashWithThunk.main() + {{[0-9]+}} in CrashWithThunk at {{.*}}/CrashWithThunk.swift:25:9
6060

61-
// FRIENDLY: 23 let foo = Foo(value: crash)
62-
// FRIENDLY-NEXT: 24
63-
// FRIENDLY-NEXT: 25 foo.value()
64-
// FRIENDLY-NEXT:
65-
// FRIENDLY-NEXT: 26 }
66-
// FRIENDLY-NEXT: 27 }
61+
// FRIENDLY: 23| let foo = Foo(value: crash)
62+
// FRIENDLY-NEXT: 24|
63+
// FRIENDLY-NEXT: 25| foo.value()
64+
// FRIENDLY-NEXT: | ^
65+
// FRIENDLY-NEXT: 26| }
66+
// FRIENDLY-NEXT: 27| }

test/Backtracing/Overflow.swift

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -64,47 +64,47 @@ struct Overflow {
6464

6565
// FRIENDLY: 0 level5() + {{[0-9]+}} in Overflow at {{.*}}/Overflow.swift:30:5
6666

67-
// FRIENDLY: 28 print("About to overflow")
68-
// FRIENDLY-NEXT: 29
69-
// FRIENDLY-NEXT: 30 x -= 1
70-
// FRIENDLY-NEXT:
71-
// FRIENDLY-NEXT: 31 }
67+
// FRIENDLY: 28| print("About to overflow")
68+
// FRIENDLY-NEXT: 29|
69+
// FRIENDLY-NEXT: 30| x -= 1
70+
// FRIENDLY-NEXT: | ^
71+
// FRIENDLY-NEXT: 31| }
7272

7373
// FRIENDLY: 1 level4() + {{[0-9]+}} in Overflow at {{.*}}/Overflow.swift:24:3
7474

75-
// FRIENDLY: 22
76-
// FRIENDLY-NEXT: 23 func level4() {
77-
// FRIENDLY-NEXT: 24 level5()
78-
// FRIENDLY-NEXT:
79-
// FRIENDLY-NEXT: 25 }
80-
// FRIENDLY-NEXT: 26
75+
// FRIENDLY: 22|
76+
// FRIENDLY-NEXT: 23| func level4() {
77+
// FRIENDLY-NEXT: 24| level5()
78+
// FRIENDLY-NEXT: | ^
79+
// FRIENDLY-NEXT: 25| }
80+
// FRIENDLY-NEXT: 26|
8181

8282
// FRIENDLY: 2 level3() + {{[0-9]+}} in Overflow at {{.*}}/Overflow.swift:20:3
8383

84-
// FRIENDLY: 18
85-
// FRIENDLY-NEXT: 19 func level3() {
86-
// FRIENDLY-NEXT: 20 level4()
87-
// FRIENDLY-NEXT:
88-
// FRIENDLY-NEXT: 21 }
89-
// FRIENDLY-NEXT: 22
84+
// FRIENDLY: 18|
85+
// FRIENDLY-NEXT: 19| func level3() {
86+
// FRIENDLY-NEXT: 20| level4()
87+
// FRIENDLY-NEXT: | ^
88+
// FRIENDLY-NEXT: 21| }
89+
// FRIENDLY-NEXT: 22|
9090

9191
// FRIENDLY: 3 level2() + {{[0-9]+}} in Overflow at {{.*}}/Overflow.swift:16:3
9292

93-
// FRIENDLY: 14
94-
// FRIENDLY-NEXT: 15 func level2() {
95-
// FRIENDLY-NEXT: 16 level3()
96-
// FRIENDLY-NEXT:
97-
// FRIENDLY-NEXT: 17 }
98-
// FRIENDLY-NEXT: 18
93+
// FRIENDLY: 14|
94+
// FRIENDLY-NEXT: 15| func level2() {
95+
// FRIENDLY-NEXT: 16| level3()
96+
// FRIENDLY-NEXT: | ^
97+
// FRIENDLY-NEXT: 17| }
98+
// FRIENDLY-NEXT: 18|
9999

100100
// FRIENDLY: 4 level1() + {{[0-9]+}} in Overflow at {{.*}}/Overflow.swift:12:3
101101

102-
// FRIENDLY: 10
103-
// FRIENDLY-NEXT: 11 func level1() {
104-
// FRIENDLY-NEXT: 12 level2()
105-
// FRIENDLY-NEXT:
106-
// FRIENDLY-NEXT: 13 }
107-
// FRIENDLY-NEXT: 14
102+
// FRIENDLY: 10|
103+
// FRIENDLY-NEXT: 11| func level1() {
104+
// FRIENDLY-NEXT: 12| level2()
105+
// FRIENDLY-NEXT: | ^
106+
// FRIENDLY-NEXT: 13| }
107+
// FRIENDLY-NEXT: 14|
108108

109109
// FRIENDLY: 5 static Overflow.main() + {{[0-9]+}} in Overflow at {{.*}}/Overflow.swift
110110

0 commit comments

Comments
 (0)