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.
[Symbolizers] On Darwin compute function offset when possible.
Summary: The sanitizer symbolizers support printing the function offset (difference between pc and function start) of a stackframe using the `%q` format specifier. Unfortunately this didn't actually work because neither the atos or dladdr symbolizer set the `AddressInfo::function_offset` field. This patch teaches both symbolizers to try to compute the function offset. In the case of the atos symbolizer, atos might not report the function offset (e.g. it reports a source location instead) so in this case it fallsback to using `dladdr()` to compute the function offset. Two test cases are included. rdar://problem/56695185 Reviewers: kubamracek, yln Subscribers: #sanitizers, llvm-commits Tags: #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D69549
- Loading branch information
Showing
4 changed files
with
107 additions
and
3 deletions.
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
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
43 changes: 43 additions & 0 deletions
43
compiler-rt/test/sanitizer_common/TestCases/Darwin/symbolizer-function-offset-atos.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,43 @@ | ||
// RUN: %clangxx %s -g -O0 -o %t-with-debug | ||
|
||
// With debug info atos reports the source location, but no function offset. We fallback to dladdr() to retrieve the function offset. | ||
// RUN: %env_tool_opts=verbosity=2,stack_trace_format='"function_name:%f function_offset:%q"' %run %t-with-debug > %t-with-debug.output 2>&1 | ||
// RUN: FileCheck -input-file=%t-with-debug.output %s | ||
|
||
// Without debug info atos reports the function offset and so dladdr() fallback is not used. | ||
// RUN: rm -rf %t-with-debug.dSYM | ||
// RUN: %env_tool_opts=verbosity=2,stack_trace_format='"function_name:%f function_offset:%q"' %run %t-with-debug > %t-no-debug.output 2>&1 | ||
// RUN: FileCheck -input-file=%t-no-debug.output %s | ||
|
||
#include <sanitizer/common_interface_defs.h> | ||
#include <stdio.h> | ||
|
||
void baz() { | ||
printf("Do stuff in baz\n"); | ||
__sanitizer_print_stack_trace(); | ||
} | ||
|
||
void bar() { | ||
printf("Do stuff in bar\n"); | ||
baz(); | ||
} | ||
|
||
void foo() { | ||
printf("Do stuff in foo\n"); | ||
bar(); | ||
} | ||
|
||
int main() { | ||
printf("Do stuff in main\n"); | ||
foo(); | ||
return 0; | ||
} | ||
|
||
// CHECK: Using atos found at: | ||
|
||
// These `function_offset` patterns are designed to disallow `0x0` which is the | ||
// value printed for `kUnknown`. | ||
// CHECK: function_name:baz{{(\(\))?}} function_offset:0x{{0*[1-9a-f][0-9a-f]*$}} | ||
// CHECK: function_name:bar{{(\(\))?}} function_offset:0x{{0*[1-9a-f][0-9a-f]*$}} | ||
// CHECK: function_name:foo{{(\(\))?}} function_offset:0x{{0*[1-9a-f][0-9a-f]*$}} | ||
// CHECK: function_name:main{{(\(\))?}} function_offset:0x{{0*[1-9a-f][0-9a-f]*$}} |
41 changes: 41 additions & 0 deletions
41
compiler-rt/test/sanitizer_common/TestCases/Darwin/symbolizer-function-offset-dladdr.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,41 @@ | ||
// UNSUPPORTED: lsan | ||
// This test fails with LSan enabled because the dladdr symbolizer actually leaks | ||
// memory because the call to `__sanitizer::DemangleCXXABI` leaks memory which LSan | ||
// detects (rdar://problem/42868950). | ||
|
||
// RUN: %clangxx %s -O0 -o %t | ||
// RUN: %env_tool_opts=verbosity=2,external_symbolizer_path=,stack_trace_format='"function_name:%f function_offset:%q"' %run %t > %t.output 2>&1 | ||
// RUN: FileCheck -input-file=%t.output %s | ||
#include <sanitizer/common_interface_defs.h> | ||
#include <stdio.h> | ||
|
||
void baz() { | ||
printf("Do stuff in baz\n"); | ||
__sanitizer_print_stack_trace(); | ||
} | ||
|
||
void bar() { | ||
printf("Do stuff in bar\n"); | ||
baz(); | ||
} | ||
|
||
void foo() { | ||
printf("Do stuff in foo\n"); | ||
bar(); | ||
} | ||
|
||
int main() { | ||
printf("Do stuff in main\n"); | ||
foo(); | ||
return 0; | ||
} | ||
|
||
// CHECK: External symbolizer is explicitly disabled | ||
// CHECK: Using dladdr symbolizer | ||
|
||
// These `function_offset` patterns are designed to disallow `0x0` which is the | ||
// value printed for `kUnknown`. | ||
// CHECK: function_name:baz{{(\(\))?}} function_offset:0x{{0*[1-9a-f][0-9a-f]*$}} | ||
// CHECK: function_name:bar{{(\(\))?}} function_offset:0x{{0*[1-9a-f][0-9a-f]*$}} | ||
// CHECK: function_name:foo{{(\(\))?}} function_offset:0x{{0*[1-9a-f][0-9a-f]*$}} | ||
// CHECK: function_name:main{{(\(\))?}} function_offset:0x{{0*[1-9a-f][0-9a-f]*$}} |