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 {
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
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.
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 .
fonte
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.
fonte
set {char[100]}(0x00) = ""
Limpa 100 bytes de memória no endereço 0x00Expandindo 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 exemploset w=1
não seria válido.Isso significa que você deve preferir a sintaxe:
set variable idx = 1
ouset 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 .
fonte