#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
будет каждый раз возвращать новый адрес.