Я знаю, що ми можемо використовувати кілька команд для доступу та читання пам'яті: наприклад, 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
Є ще. Прочитайте посібник .
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 w=1
не буде дійсним.
Це означає, що вам слід віддавати перевагу синтаксису: set variable idx = 1
або set var idx = 1
.
І останнє, але не менш важливе: ви можете просто використовувати свою надійну стару команду друку, оскільки вона обчислює вираз. Єдина відмінність полягає в тому, що він також друкує результат виразу.
(gdb) p idx = 1
$1 = 1
Детальніше про gdb ви можете прочитати тут .