Как изменить содержимое памяти с помощью GDB?
Я знаю, что мы можем использовать несколько команд для доступа и чтения памяти: например, print, p, x...
но как я могу изменить содержимое памяти в любом конкретном месте (при отладке в GDB)?
3 ответа:
проще всего установить переменную программы (см. GDB: назначение):
(gdb) l 6 { 7 int i; 8 struct file *f, *ftmp; 9 (gdb) set variable i = 10 (gdb) p i = 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 = 10 (gdb) p &i = (int *) 0xbfbb0000 (gdb) set *((int *) 0xbfbb0000) = 20 (gdb) p i = 20
Это должно работать для любого допустимого указателя и может быть приведено к любому соответствующему типу данных.
расширяя ответы, представленные здесь.
вы можете просто сделать
set idx = 1
для установки переменной, но этот синтаксис не рекомендуется, поскольку имя переменной может конфликтовать с подкомандой set. В качестве примераset w=1
не будет действительным.Это означает, что вы должны предпочесть синтаксис:
set variable idx = 1
илиset var idx = 1
.и последнее, но не менее важное: вы можете просто использовать свою надежную старую команду печати, поскольку она оценивает выражение. Разница только в том, что он также печатает результат выражения.
(gdb) p idx = 1 = 1
вы можете прочитать больше о gdb здесь.