aadsm created this revision.
aadsm added reviewers: clayborg, jingham, JDevlieghere.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.
aadsm requested review of this revision.
I found an issue where the expression evaluation doesn't work (for non trivial
exprs) when the leak sanitizer is enabled in the process being debugged.
lldb defaults to interpertation because it thinks it can't JIT it (and most
interesting exprs can't be interpreted). The JIT check fails because calling
the process's mmap fails.
I debugged the InferiorCallMmap function to figure this out. This function
finds all functions with mmap name in it and executes the first one in that
list.
When asan is enabled (and by default on linux it turns on the leak sanitizer)
it introduces a new mmap symbol in the binary (the only that will be called
instead of the real one). This can be found here:
https://github.com/llvm/llvm-project/blob/master/compiler-rt/lib/sanitizer_common/symbolizer/sanitizer_wrappers.cpp#L155-L160.
And there is also another new function named __interceptor_mmap which
registers the call for the sanitizer I think. You can find that one here (I
think):
https://github.com/llvm/llvm-project/blob/6148cca70888ead020a808279043fd013ca72a2a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc#L7304-L7313.
When lldb calls the redefined mmap it will return -1 but will be able to
allocate memory if it calls the __interceptor_mmap though. Both functions end
up calling __internal_mmap but the big difference between the two is that the
redefiend mmap also checks the return of internal_mmap with `internal_iserror`
and will return -1 when it fails the check. Here's the code for that:
https://github.com/llvm/llvm-project/blob/6148cca70888ead020a808279043fd013ca72a2a/compiler-rt/lib/sanitizer_common/sanitizer_syscall_linux_x86_64.inc#L83-L90.
Not really sure why to be honest. I tried to debug but it was not simple
inside the ThreadPlanCallFunction, I tried to enable SINGLE_STEP_EXPRESSIONS
but then the process kind of dies on me.
I came up with a simple fix to get around this which is to try each mmap we
find (and not only the first one) until we find one that works. Another
possible solution is to see if internal_mmap exists and call that one if it
does.. I feel it's a bit more implementation dependent though, while the loop
sounds more future proof (I'm assuming calling a bunch of mmaps until one
actually works won't launch missiles).
Thoughts?
(This implemention is not final, it should be possible to move a bunch of
things out of the loop I believe)
Not really sure how to add for review so adding a few people I've seen in the
code.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D87868
Files:
lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp
Index: lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp
===================================================================
--- lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp
+++ lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp
@@ -48,9 +48,9 @@
ConstString("mmap"), eFunctionNameTypeFull, include_symbols,
include_inlines, sc_list);
const uint32_t count = sc_list.GetSize();
- if (count > 0) {
+ for (uint32_t i = 0; i < count; i++) {
SymbolContext sc;
- if (sc_list.GetContextAtIndex(0, sc)) {
+ if (sc_list.GetContextAtIndex(i, sc)) {
const uint32_t range_scope =
eSymbolContextFunction | eSymbolContextSymbol;
const bool use_inline_block_range = false;
@@ -112,10 +112,10 @@
LLDB_INVALID_ADDRESS);
if (process->GetAddressByteSize() == 4) {
if (allocated_addr == UINT32_MAX)
- return false;
+ continue;
} else if (process->GetAddressByteSize() == 8) {
if (allocated_addr == UINT64_MAX)
- return false;
+ continue;
}
return true;
}
Index: lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp
===================================================================
--- lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp
+++ lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp
@@ -48,9 +48,9 @@
ConstString("mmap"), eFunctionNameTypeFull, include_symbols,
include_inlines, sc_list);
const uint32_t count = sc_list.GetSize();
- if (count > 0) {
+ for (uint32_t i = 0; i < count; i++) {
SymbolContext sc;
- if (sc_list.GetContextAtIndex(0, sc)) {
+ if (sc_list.GetContextAtIndex(i, sc)) {
const uint32_t range_scope =
eSymbolContextFunction | eSymbolContextSymbol;
const bool use_inline_block_range = false;
@@ -112,10 +112,10 @@
LLDB_INVALID_ADDRESS);
if (process->GetAddressByteSize() == 4) {
if (allocated_addr == UINT32_MAX)
- return false;
+ continue;
} else if (process->GetAddressByteSize() == 8) {
if (allocated_addr == UINT64_MAX)
- return false;
+ continue;
}
return true;
}
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits