Как использовать команду lldb "memory find"?


Согласно справке lldb online, memory find должно работать следующим образом:

Find a value in the memory of the process being debugged.

Syntax: memory find <cmd-options> <address> <value> [<value> [...]]

Command Options Usage:
  memory find <address> <value> [<value> [...]]
  memory find [-e <expr>] [-s <name>] [-c <count>] [-o <offset>] <address> <value> [<value> [...]]

       -c <count> ( --count <count> )
            How many times to perform the search.

       -e <expr> ( --expression <expr> )
            Evaluate an expression to obtain a byte pattern.

       -o <offset> ( --dump-offset <offset> )
            When dumping memory for a match, an offset from the match location
            to start dumping from.

       -s <name> ( --string <name> )
            Use text to find a byte pattern.

     This command takes options and free-form arguments.  If your arguments
     resemble option specifiers (i.e., they start with a - or --), you must use
     ' -- ' between the end of the command options and the beginning of the
     arguments.

Я подозреваю, что реализация не соответствует справочной информации, поскольку какой бы синтаксис я ни использовал, я, кажется, получаю одно из различных зашифрованных сообщений об ошибках, например:

error: two addresses needed for memory find

Или

error: do not know how to deal with larger than 8 byte result types. pass a string instead

Или

error: please pass either a block of text, or an expression to evaluate.

Я погуглил примеры использования и ничего не нашел. Если у кого-то есть пример, который работает, я буду благодарен. В частности, я хочу искать с самого начала блока, идентифицированного a указатель, для заданного числа байтов, чтобы найти первое вхождение определенного (байтового) значения (в данном случае 255).

Я использую Xcode 7.0.1 на OS X, а версия lldb - lldb-340.4.70.


Обновление

Я обнаружил, что опция -s может работать, например, так:

(lldb) me fi -s "f" -- ptr ptr+8192*256
Your data was found at location: 0x11033e20c
0x11033e20c: 66 bb 58 07 d0 b7 32 7d ff 7f 00 00 66 5b e7 82  f.X...2}....f[..

Вполне возможно, что опция -e (которая мне нужна в данном случае) сломана, например:

(lldb) me fi -e 255 -- ptr ptr+8191*256
error: expression evaluation failed. pass a string instead?

Попытка уговорить опцию -s принять экранированный шестнадцатеричный код или десятичное значение, похоже, тоже не работает, к сожалению:

(lldb) me fi -s "xff" -- ptr ptr+8191*256
Your data was not found within the range.

(lldb) me fi -s "255" -- ptr ptr+8191*256
Your data was not found within the range.
1 4

1 ответ:

Эта проблема была исправлена в LLDB с открытым исходным кодом, как редакция 243893 (http://llvm.org/viewvc/llvm-project?view=revision&revision=243893 )

Я не могу комментировать доступность этого исправления в Xcode, но одна вещь, которую вы можете попробовать, - это скомпилировать LLDB из исходного кода и использовать этот ручной LLDB с исправлением для отладки вашей проблемы