GDB step in inays

6

Estou fazendo uma boa apresentação da execução do código de montagem ARM e precisaria que o GDB passe o código a cada 1 segundo infinitamente longo (bem até pressionar CTRL + C ). Alguém tem solução?

Eu não quero ficar parado ao lado do teclado e seguir o programa quando os visitantes vierem visitar minha barraca.

    
por 71GA 08.02.2018 / 22:37

3 respostas

8

A CLI do Gdb suporta um loop while . Não há um comando sleep embutido, mas você pode chamar o shell para executar o programa sleep , ou usar o interpretador python embutido do gdb, se ele tiver um. É interrompível com o Control-C.

Método 1:

(gdb) while (1)
 >step
 >shell sleep 1
 >end

Método 2:

(gdb) python import time
(gdb) while (1)
 >step
 >python time.sleep(1)
 >end

Método 3 (defina uma macro):

(gdb) define runslowly
Type commands for definition of "runslowly".
End with a line saying just "end".
>python import time
>while (1)
 >step
 >python time.sleep(1)
 >end
>end
(gdb) document runslowly
Type documentation for "runslowly".
End with a line saying just "end".
>step a line at a time, every 1 second
>end

(gdb) runslowly
    
por 09.02.2018 / 00:04
7

expect pode automatizar isso

#!/usr/bin/env expect
spawn -noecho gdb -q ls
expect -ex {(gdb)}
send -- "break main\r"
expect -ex {(gdb)}
send -- "run\r"
while {1} {
    expect -ex {(gdb)}
    send -- "s\r"
    sleep 1
}

ou se houver risco de o programa ficar sem s , você pode repetidamente gdb com um pouco mais de complicação

#!/usr/bin/env expect

while {1} {
    spawn -noecho gdb -q ls
    expect -ex {(gdb)}
    send -- "break main\r"
    expect -ex {(gdb)}
    send -- "run\r"
    expect {
        -ex {The program is not being run} {}
        eof {}
        -ex {(gdb)} {
            send -- "s\r"
            sleep 1
            exp_continue
        }
    }
}
    
por 08.02.2018 / 22:57
3

Você pode ter o shell pipe em comandos; aqui está a ideia:

while :; do echo step; sleep 1; done | gdb arm-program

gdb lê os comandos do pipe; ele vê um comando "step" a cada segundo ad infinitum.

Você pode configurar alguns pontos de interrupção e executar o programa; ajustar a gosto:

(echo br 1; echo run; while :; do echo step; sleep 1; done ) | gdb arm-program
    
por 08.02.2018 / 22:55

Tags