Як змінити вміст пам'яті за допомогою GDB?


87

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

Але як я можу змінити вміст пам'яті в будь-якому конкретному місці (під час налагодження в GDB)?


Відповіді:


124

Найпростішим є встановлення змінної програми (див. 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

Є ще. Прочитайте посібник .


4
Мені потрібно встановити змінну програми ДО доступу до довільних місць пам'яті? Чи не можу я просто запустити команду другого набору відразу?
Spidey

також set (str[6]) = 'c'працює, якщо у вас є масив, наприкладchar str[]
xealits

29

Як сказав Микола, ви можете використовувати команду 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
davenpcj

16

Розширюючи відповіді, подані тут.

Ви можете просто set idx = 1встановити змінну, але такий синтаксис не рекомендується, оскільки ім’я змінної може зіткнутися з заданою підкомандою. Як приклад set w=1не буде дійсним.

Це означає, що вам слід віддавати перевагу синтаксису: set variable idx = 1або set var idx = 1.

І останнє, але не менш важливе: ви можете просто використовувати свою надійну стару команду друку, оскільки вона обчислює вираз. Єдина відмінність полягає в тому, що він також друкує результат виразу.

(gdb) p idx = 1
$1 = 1

Детальніше про gdb ви можете прочитати тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.