Мне нужно установить программную переменную ПЕРЕД доступом к произвольным ячейкам памяти? Разве я не могу сразу запустить вторую команду set?
Spidey
также set (str[6]) = 'c'работает, если у вас есть массив, напримерchar str[]
xealits
29
Как сказал Николай, вы можете использовать команду gdb 'set' для изменения значения переменной.
Вы также можете использовать команду «set» для изменения местоположения памяти. например. Развивая пример Николая:
(gdb) l
6 {
7int i;
8structfile *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 {char[100]}(0x00) = ""Очищает 100 байт памяти по адресу 0x00
davenpcj
16
Расширяя ответы, представленные здесь.
Вы можете просто set idx = 1установить переменную, но такой синтаксис не рекомендуется, поскольку имя переменной может конфликтовать с подкомандой set. В качестве примера set w=1не годится.
Это означает, что вам следует предпочесть синтаксис: set variable idx = 1или set var idx = 1.
И последнее, но не менее важное: вы можете просто использовать свою верную старую команду печати, поскольку она вычисляет выражение. Единственная разница в том, что он также выводит результат выражения.
Ответы:
Самый простой - установить программную переменную (см. 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
Есть больше. Прочтите инструкцию .
источник
set (str[6]) = 'c'
работает, если у вас есть массив, напримерchar str[]
Как сказал Николай, вы можете использовать команду 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 {char[100]}(0x00) = ""
Очищает 100 байт памяти по адресу 0x00Расширяя ответы, представленные здесь.
Вы можете просто
set idx = 1
установить переменную, но такой синтаксис не рекомендуется, поскольку имя переменной может конфликтовать с подкомандой set. В качестве примераset w=1
не годится.Это означает, что вам следует предпочесть синтаксис:
set variable idx = 1
илиset var idx = 1
.И последнее, но не менее важное: вы можете просто использовать свою верную старую команду печати, поскольку она вычисляет выражение. Единственная разница в том, что он также выводит результат выражения.
(gdb) p idx = 1 $1 = 1
Вы можете узнать больше о gdb здесь .
источник