forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 333
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[lldb][FrameRecognizer] Display the first non-std frame on verbose_tr…
…ap (llvm#108825) This attempts to improve user-experience when LLDB stops on a verbose_trap. Currently if a `__builtin_verbose_trap` triggers, we display the first frame above the call to the verbose_trap. So in the newly added test case, we would've previously stopped here: ``` (lldb) run Process 28095 launched: '/Users/michaelbuch/a.out' (arm64) Process 28095 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = Bounds error: out-of-bounds access frame #1: 0x0000000100003f5c a.out`std::__1::vector<int>::operator[](this=0x000000016fdfebef size=0, (null)=10) at verbose_trap.cpp:6:9 3 template <typename T> 4 struct vector { 5 void operator[](unsigned) { -> 6 __builtin_verbose_trap("Bounds error", "out-of-bounds access"); 7 } 8 }; ``` After this patch, we would stop in the first non-`std` frame: ``` (lldb) run Process 27843 launched: '/Users/michaelbuch/a.out' (arm64) Process 27843 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = Bounds error: out-of-bounds access frame #2: 0x0000000100003f44 a.out`g() at verbose_trap.cpp:14:5 11 12 void g() { 13 std::vector<int> v; -> 14 v[10]; 15 } 16 ``` rdar://134490328 (cherry picked from commit bca5073)
- Loading branch information
1 parent
a860c72
commit aefe9b3
Showing
11 changed files
with
214 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 22 additions & 0 deletions
22
lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl-callback-user-leaf.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
void definitely_aborts() { __builtin_verbose_trap("User", "Invariant violated"); } | ||
|
||
namespace std { | ||
void aborts_soon() { definitely_aborts(); } | ||
} // namespace std | ||
|
||
void g() { std::aborts_soon(); } | ||
|
||
namespace std { | ||
namespace detail { | ||
void eventually_aborts() { g(); } | ||
} // namespace detail | ||
|
||
inline namespace __1 { | ||
void eventually_aborts() { detail::eventually_aborts(); } | ||
} // namespace __1 | ||
} // namespace std | ||
|
||
int main() { | ||
std::eventually_aborts(); | ||
return 0; | ||
} |
22 changes: 22 additions & 0 deletions
22
lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl-callback.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
namespace std { | ||
void definitely_aborts() { __builtin_verbose_trap("Failed", "Invariant violated"); } | ||
|
||
void aborts_soon() { definitely_aborts(); } | ||
} // namespace std | ||
|
||
void g() { std::aborts_soon(); } | ||
|
||
namespace std { | ||
namespace detail { | ||
void eventually_aborts() { g(); } | ||
} // namespace detail | ||
|
||
inline namespace __1 { | ||
void eventually_aborts() { detail::eventually_aborts(); } | ||
} // namespace __1 | ||
} // namespace std | ||
|
||
int main() { | ||
std::eventually_aborts(); | ||
return 0; | ||
} |
13 changes: 13 additions & 0 deletions
13
lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl-max-depth.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
namespace std { | ||
void recursively_aborts(int depth) { | ||
if (depth == 0) | ||
__builtin_verbose_trap("Error", "max depth"); | ||
|
||
recursively_aborts(--depth); | ||
} | ||
} // namespace std | ||
|
||
int main() { | ||
std::recursively_aborts(256); | ||
return 0; | ||
} |
21 changes: 21 additions & 0 deletions
21
lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl-nested.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
namespace std { | ||
namespace detail { | ||
void function_that_aborts() { __builtin_verbose_trap("Bounds error", "out-of-bounds access"); } | ||
} // namespace detail | ||
|
||
inline namespace __1 { | ||
template <typename T> struct vector { | ||
void operator[](unsigned) { detail::function_that_aborts(); } | ||
}; | ||
} // namespace __1 | ||
} // namespace std | ||
|
||
void g() { | ||
std::vector<int> v; | ||
v[10]; | ||
} | ||
|
||
int main() { | ||
g(); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
namespace std { | ||
inline namespace __1 { | ||
template <typename T> struct vector { | ||
void operator[](unsigned) { __builtin_verbose_trap("Bounds error", "out-of-bounds access"); } | ||
}; | ||
} // namespace __1 | ||
} // namespace std | ||
|
||
void g() { | ||
std::vector<int> v; | ||
v[10]; | ||
} | ||
|
||
int main() { | ||
g(); | ||
return 0; | ||
} |
22 changes: 22 additions & 0 deletions
22
lldb/test/Shell/Recognizer/verbose_trap-in-stl-callback-user-leaf.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
# Tests that we show the first non-STL frame when | ||
# a verbose_trap triggers from within the STL. | ||
# | ||
# Specifically tests that we correctly handle backtraces | ||
# of the form: | ||
# #0 __builtin_verbose_trap | ||
# #1 user-code | ||
# #2 STL | ||
# #3 user-code | ||
# #4 STL | ||
# #5 user-code | ||
|
||
# UNSUPPORTED: system-windows | ||
# | ||
# RUN: %clang_host -g -O0 %S/Inputs/verbose_trap-in-stl-callback-user-leaf.cpp -o %t.out | ||
# RUN: %lldb -b -s %s %t.out | FileCheck %s --check-prefixes=CHECK | ||
|
||
run | ||
# CHECK: thread #{{.*}}stop reason = User: Invariant violated | ||
frame info | ||
# CHECK: frame #{{.*}}`definitely_aborts() at verbose_trap-in-stl-callback-user-leaf.cpp | ||
q |
21 changes: 21 additions & 0 deletions
21
lldb/test/Shell/Recognizer/verbose_trap-in-stl-callback.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# Tests that we show the first non-STL frame when | ||
# a verbose_trap triggers from within the STL. | ||
# | ||
# Specifically tests that we correctly handle backtraces | ||
# of the form: | ||
# #0 __builtin_verbose_trap | ||
# #1 STL | ||
# #2 user-code | ||
# #3 STL | ||
# #4 user-code | ||
|
||
# UNSUPPORTED: system-windows | ||
# | ||
# RUN: %clang_host -g -O0 %S/Inputs/verbose_trap-in-stl-callback.cpp -o %t.out | ||
# RUN: %lldb -b -s %s %t.out | FileCheck %s --check-prefixes=CHECK | ||
|
||
run | ||
# CHECK: thread #{{.*}}stop reason = Failed: Invariant violated | ||
frame info | ||
# CHECK: frame #{{.*}}`g() at verbose_trap-in-stl-callback.cpp | ||
q |
16 changes: 16 additions & 0 deletions
16
lldb/test/Shell/Recognizer/verbose_trap-in-stl-max-depth.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# Tests that the VerboseTrapFrameRecognizer stops | ||
# walking the stack once a certain implementation-defined | ||
# threshold is reached. | ||
|
||
# UNSUPPORTED: system-windows | ||
# | ||
# RUN: %clang_host -g -O0 %S/Inputs/verbose_trap-in-stl-max-depth.cpp -o %t.out | ||
# RUN: %lldb -b -s %s %t.out | FileCheck %s --check-prefixes=CHECK | ||
|
||
run | ||
# CHECK: thread #{{.*}}stop reason = | ||
frame recognizer info 0 | ||
# CHECK: frame 0 is recognized by Verbose Trap StackFrame Recognizer | ||
frame info | ||
# CHECK: frame #0: {{.*}}`std::recursively_aborts(int) {{.*}} at verbose_trap-in-stl-max-depth.cpp | ||
q |
13 changes: 13 additions & 0 deletions
13
lldb/test/Shell/Recognizer/verbose_trap-in-stl-nested.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# Tests that we show the first non-STL frame when | ||
# a verbose_trap triggers from within the STL. | ||
|
||
# UNSUPPORTED: system-windows | ||
# | ||
# RUN: %clang_host -g -O0 %S/Inputs/verbose_trap-in-stl-nested.cpp -o %t.out | ||
# RUN: %lldb -b -s %s %t.out | FileCheck %s --check-prefixes=CHECK | ||
|
||
run | ||
# CHECK: thread #{{.*}}stop reason = Bounds error: out-of-bounds access | ||
frame info | ||
# CHECK: frame #{{.*}}`g() at verbose_trap-in-stl-nested.cpp | ||
q |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# Tests that we show the first non-STL frame when | ||
# a verbose_trap triggers from within the STL. | ||
|
||
# UNSUPPORTED: system-windows | ||
# | ||
# RUN: %clang_host -g -O0 %S/Inputs/verbose_trap-in-stl.cpp -o %t.out | ||
# RUN: %lldb -b -s %s %t.out | FileCheck %s --check-prefixes=CHECK | ||
|
||
run | ||
# CHECK: thread #{{.*}}stop reason = Bounds error: out-of-bounds access | ||
frame info | ||
# CHECK: frame #{{.*}}`g() at verbose_trap-in-stl.cpp | ||
q |