Использование адресов удобных переменных в GDB

#c #gdb

#c #gdb

Вопрос:

Иногда я сталкиваюсь с функциями, которые я хочу вызвать в своей отладке, которые принимают указатель в качестве аргумента и изменяют содержимое, на которое указано. Пример:

 int doFoo(int a, double* b)
  

Я хотел бы вызвать эту функцию из gdb, но double* у меня ее нет. Возможно ли это сделать с помощью удобных переменных? Просто вызывая

 set $foo = 1.0
call doFoo(0, amp;($foo))
  

не работает.

Комментарии:

1. Если у вас нет double возможности действовать «лежа», какой цели doFoo() служит вызов в этот момент? Я в замешательстве.

2. Вызов malloc для создания переменной. Я не думаю, что это возможно с удобными переменными, потому что они находятся в адресном пространстве GDB, а не в адресном пространстве целевого процесса.

3. @DevSolar например, вы возвращаете значение, но также вводите указатель bool, который отражает, был ли вызов функции успешным

4. std::необязательно, исключение, какое-то сигнальное возвращаемое значение (например, -1) или даже код ошибки по ссылке… но bool по ссылке? Мне это не нравится.

5. @DevSolar Мы говорим здесь о C, а не о C , поэтому здесь нет std::optional и это указатель, а не ссылка. Это довольно часто встречается в некоторых кодах, где ваша функция возвращает код возврата, и вы передаете указатель bool, который отражает, например, было ли сохранено решение.

Ответ №1:

Похоже, это работает:

 set var $foo = amp;{1.0}
call doFoo(0, $foo)
p *$foo
  

Использование {} заставляет GDB выделять двойной массив с одним элементом в памяти процесса.
Обратите внимание, что без amp; назначения вычисление $foo будет каждый раз возвращать новый адрес.