Я знаю, что мы можем использовать несколько команд для доступа и чтения памяти: например, print, p, x...
Но как я могу изменить содержимое памяти в любом конкретном месте (при отладке в GDB)?
Я знаю, что мы можем использовать несколько команд для доступа и чтения памяти: например, print, p, x...
Но как я могу изменить содержимое памяти в любом конкретном месте (при отладке в GDB)?
Самый простой способ - установить программную переменную (см. GDB: назначение):
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
Или вы можете просто обновить произвольное (записываемое) местоположение по адресу:
(gdb) set {int}0x83040 = 4
Там больше. Прочтите руководство.
Как сказал Николай, вы можете использовать команду gdb 'set' для изменения значения переменной.
Вы также можете использовать команду 'set' для изменения местоположения памяти. например. Расширение на примере Николая:
(gdb) l
6 {
7 int i;
8 struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10
(gdb) p &i
$2 = (int *) 0xbfbb0000
(gdb) set *((int *) 0xbfbb0000) = 20
(gdb) p i
$3 = 20
Это должно работать для любого допустимого указателя и может быть применено к любому соответствующему типу данных.
Расширение ответов, представленных здесь.
Вы можете просто сделать set idx = 1
, чтобы установить переменную, но этот синтаксис не рекомендуется, так как имя переменной может столкнуться с установленной подкомандой. В качестве примера set w=1
недействительно.
Это означает, что вы должны предпочесть синтаксис: set variable idx = 1
или set var idx = 1
.
И последнее, но не менее важное: вы можете просто использовать свою надежную старую команду печати, так как она оценивает выражение. Единственное отличие состоит в том, что он также печатает результат выражения.
(gdb) p idx = 1
$1 = 1
Подробнее о gdb здесь.