2014-02-18 5 views
3

Каков синтаксис установки условной точки останова в lldb в соответствии со значением в памяти?Условная точка останова в lldb в соответствии со значением в памяти?

Что-то вроде:

breakpoint modify -c "memory read -Gx $esp+4 == 0"

Кроме того, я предполагаю, что я мог бы установить точку останова командой, чтобы продолжить, если условие ложно, но я не смог найти синтаксис, что хорошо :)

ответ

8

breakpoint modify--condition аргумент принимает выражение C++, оценивает его при ударе точки останова, и если результат отличен от нуля (true), точка останова останавливается.

(lldb) br s -n foo 
Breakpoint 1: where = a.out`foo, address = 0x00001f30 
(lldb) br mod -c '*(int*) ($esp+4) == 10' 
(lldb) r 
Process 11102 launched: '/private/tmp/a.out' (i386) 
Process 11102 stopped 
* thread #1: tid = 0x42c6f9, 0x00001f30 a.out`foo, queue = 'com.apple.main-thread, stop reason = breakpoint 1.1 
    #0: 0x00001f30 a.out`foo 
a.out`foo: 
-> 0x1f30: pushl %ebp 
    0x1f31: movl %esp, %ebp 
    0x1f33: pushl %eax 
    0x1f34: movl 8(%ebp), %eax 
(lldb) x/x $esp+4 
0xbffffbf0: 0x0000000a 
(lldb) 

Скобки вокруг $esp+4 является сохранение арифметики указателей от того, размер посещающих int *. Без этих скобок выражение будет разыменовываться $esp+16.

На платформах, где аргументы передаются в регистрах (x86_64, ARMv7, arm64 для некоторого числа аргументов), lldb обеспечивает удобство регистра псевдонимы, $arg1, $arg2 и т.д., которые удобны для этих видов точек останова условий.

+0

Спасибо, что поделились советом о $ args! – Danra

+0

О, да, спасибо за подсказку '$ args': D – Qix

 Смежные вопросы

  • Нет связанных вопросов^_^