#gdb
#gdb
Вопрос:
Я пишу макрос GDB для анализа ядра и печати строки. Вывод строки из ядра — «sp-4/0/2». Теперь мне нужно напечатать только «sp», исключая другие. Я не уверен, как добиться этого в GDB. Любые указатели на это были бы большим подспорьем.
Заранее спасибо.
Ответ №1:
Смотрите, argv[1] — это «sp-4/0/2»
(gdb) p argv[1]
$4 = 0x7fffffffe3fa "sp-4/0/2"
И это только два первых символа:
(gdb) printf "%.2sn", argv[1]
sp
Или
(gdb) printf "%c%cn", argv[1][0],argv[1][1]
sp
Ответ №2:
Следующая альтернатива работает, даже если размер не известен статически:
(gdb) p {char} argv[1]@2
Т.е. Вы можете заменить значение 2
переменной или регистра. Это полезно, когда вы добавляете точку останова, например write
, и у вас нет доступных символов отладки:
(gdb) b -qualified write # only match write, don't do globbing
(gdb) cond 1 $rdi == 2 # only when writing to stderr
(gdb) command 1
bt
p {char} $rsi@$rdx # print (partial) buffer
cont
Вышеуказанное работает, когда используется соглашение о вызовах System V AMD64, но может быть легко адаптировано к соглашениям о вызовах arm путем адаптации регистров.