Como modificar o conteúdo da memória usando GDB?


Respostas:


124

O mais fácil é definir uma variável de programa (ver GDB: atribuição ):

(gdb) l
6       {
7           int i;
8           struct file *f, *ftmp;
9
(gdb) set variable i = 10
(gdb) p i
$1 = 10

Ou você pode apenas atualizar a localização arbitrária (gravável) por endereço:

(gdb) set {int}0x83040 = 4

Tem mais. Leia o manual .


4
Eu preciso definir uma variável de programa ANTES de acessar locais de memória arbitrários? Não posso simplesmente executar o segundo comando set imediatamente?
Spidey

também set (str[6]) = 'c'funciona, caso você tenha uma matriz, comochar str[]
xealits

29

Como Nikolai disse, você pode usar o comando gdb 'set' para alterar o valor de uma variável.

Você também pode usar o comando 'set' para alterar os locais da memória. por exemplo. Expandindo o exemplo de Nikolai:

(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

Isso deve funcionar para qualquer ponteiro válido e pode ser convertido para qualquer tipo de dados apropriado.


set {char[100]}(0x00) = ""Limpa 100 bytes de memória no endereço 0x00
davenpcj

16

Expandindo as respostas fornecidas aqui.

Você pode apenas fazer set idx = 1para definir uma variável, mas essa sintaxe não é recomendada porque o nome da variável pode entrar em conflito com um subcomando set. Como exemplo set w=1não seria válido.

Isso significa que você deve preferir a sintaxe: set variable idx = 1ou set var idx = 1.

Por último, mas não menos importante, você pode simplesmente usar seu antigo e confiável comando de impressão, já que ele avalia uma expressão. A única diferença é que ele também imprime o resultado da expressão.

(gdb) p idx = 1
$1 = 1

Você pode ler mais sobre gdb aqui .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.