[Lldb-commits] [lldb] [lldb] Fix and speedup the `memory find` command (PR #104193)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Wed Aug 28 08:38:07 PDT 2024
================
@@ -3367,21 +3340,48 @@ lldb::addr_t Process::FindInMemory(lldb::addr_t low, lldb::addr_t high,
if (region_size < size)
return LLDB_INVALID_ADDRESS;
+ // See "Boyer-Moore string search algorithm".
std::vector<size_t> bad_char_heuristic(256, size);
- ProcessMemoryIterator iterator(*this, low);
-
for (size_t idx = 0; idx < size - 1; idx++) {
decltype(bad_char_heuristic)::size_type bcu_idx = buf[idx];
bad_char_heuristic[bcu_idx] = size - idx - 1;
}
- for (size_t s = 0; s <= (region_size - size);) {
+
+ // Memory we're currently searching through.
+ llvm::SmallVector<uint8_t, 0> mem;
+ // Position of the memory buffer.
+ addr_t mem_pos = low;
+ // Maximum number of bytes read (and buffered). We need to read at least
+ // `size` bytes for a successful match.
+ const size_t max_read_size = std::max<size_t>(size, 0x10000);
+
+ for (addr_t s = low; s <= (high - size);) {
+ if (s + size > mem.size() + mem_pos) {
+ // We need to read more data. We don't attempt to reuse the data we've
+ // already read (up to `size-1` bytes from `s` to `mem_pos+mem.size()`).
+ // This is fine for patterns much smaller than max_read_size. For very
+ // long patterns we may need to do something more elaborate.
+ mem.resize_for_overwrite(max_read_size);
+ Status error;
+ mem.resize(
+ ReadMemory(s, mem.data(), std::min(mem.size(), high - s), error));
+ mem_pos = s;
+ if (error.Fail() || size > mem.size()) {
+ // We didn't read enough data. Skip to the next memory region.
+ MemoryRegionInfo info;
+ error = GetMemoryRegionInfo(mem_pos + mem.size(), info);
+ if (error.Fail())
+ break;
+ s = info.GetRange().GetRangeEnd();
----------------
labath wrote:
Correct. mem_pos is updated when changing the `mem` array, which we're not doing here. That will happen on the next iteration of the loop when we realize that the mem buffer does not hold the thing we're interested in.
https://github.com/llvm/llvm-project/pull/104193
More information about the lldb-commits
mailing list