Как изменить содержимое памяти с помощью GDB?


Я знаю, что мы можем использовать несколько команд для доступа и чтения памяти: например, print, p, x...

но как я могу изменить содержимое памяти в любом конкретном месте (при отладке в GDB)?

3 68

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 здесь.