Синтаксис для передачи пользовательской переменной в качестве опции команды - PullRequest
0 голосов
/ 11 октября 2019

В LLDB версии 8 я пытаюсь сбросить байты кода для функции "fh", используя команду memory read, используя переменные для вычисления длины:

(lldb) expr unsigned $addr = (unsigned) fh
(lldb) expr unsigned $next_addr = (unsigned) fi
(lldb) expr unsigned $len = $next_addr - $addr
(lldb) p/x $addr
(unsigned int) $addr = 0x00000286
(lldb) p/x $next_addr
(unsigned int) $next_addr = 0x000002e4
(lldb) p/x $len
(unsigned int) $len = 0x0000005e

Передача $addrтак как адрес правильно интерпретируется с целым литералом как длина:

(lldb) memory read --size 1 --format x --count 0x5e $addr
0x00000286: 0xc8 0x47 0202 0x48 0xc9 0x42 ...

, но передача $len в качестве аргумента для опции count не удается:

(lldb) memory read --size 1 --format x --count $len $addr
error: invalid uint64_t string value: '$len'

Это также происходит ссинтаксис точки останова, так что это может быть общим ограничением при разборе параметров:

(lldb) breakpoint set -l $len
error: invalid line number: $len.

Я также пытался передать его через псевдоним команды в надежде, что подстановка значения переменной произойдет раньше, но имела аналогичныеРезультаты:

(lldb) command alias foop memory read  --size 1 --format x --count %1 %2
(lldb) foop $len $addr
error: invalid uint64_t string value: '$len'

Есть ли какой-то другой синтаксис для вычисления команды с переменными? Я бы предпочел не полагаться на поддержку Python, поскольку используемая мной цепочка инструментов не обеспечивает ее надежно.

1 Ответ

0 голосов
/ 11 октября 2019

Вы можете узнать, будет ли аргумент опции оцениваться или считываться напрямую, посмотрев в справку для опции. Например, аргумент для чтения из памяти дается в виде <address-expression> и:

(lldb) help address-expression
  <address-expression> -- An expression that resolves to an address.

, но count имеет тип «count» - это просто целое число без знака.

Но... Еще один момент синтаксиса lldb заключается в том, что если какой-либо аргумент или значение параметра заключено в ``, оно сначала оценивается как выражение, а если результат является скаляром, это значение используется для параметра.

Итак, вы хотите сказать:

memory read --size 1 --format x --count `$len` $addr
...