Eu sei que podemos usar vários comandos para acessar e ler a memória: por exemplo, print, p, x ...
Mas como posso alterar o conteúdo da memória em qualquer local específico (durante a depuração no GDB)?
Eu sei que podemos usar vários comandos para acessar e ler a memória: por exemplo, print, p, x ...
Mas como posso alterar o conteúdo da memória em qualquer local específico (durante a depuração no GDB)?
Respostas:
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 .
set (str[6]) = 'c'
funciona, caso você tenha uma matriz, comochar str[]
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
Expandindo as respostas fornecidas aqui.
Você pode apenas fazer set idx = 1
para 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=1
não seria válido.
Isso significa que você deve preferir a sintaxe: set variable idx = 1
ou 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 .