Executando programas para trás

7

Eu nunca usei um depurador que pode executar um programa para trás, mas gostaria. Agora, pergunto-me se há muita evidência e teoria sobre programação executável reversa, quando e por que um programa pode ser executado inversamente ou quando e por que não?

Intuitivamente, acho que o computador deve ser capaz de executar o programa para trás, se ele tiver executado o programa para a frente sabendo que o programa será executado para trás, salvando estados do programa que, de outra forma, poderiam se perder e desalocar.

A depuração é apenas um exemplo prático. Também estou interessado por causa da teoria da reversibilidade; se o programa pode ser executado de trás para frente, o que o programa faz é reversível, não é?

Niklas
fonte
11
Eu estive pensando em depuração reversa antes de uma perspectiva prática. Eu acho que seria um plugin matador para qualquer IDE. Existem algumas observações iniciais óbvias: 1. Ao gravar em uma variável no modo de avanço, você precisa armazenar seu estado anterior (por exemplo, isso custa ~ 2,4 GB de memória / s). 2. Se você deseja evitar a memória extra, é possível executar novamente o programa até a linha na qual deseja depurar. 3. Você pode fazer uma troca entre os dois pontos anteriores. 4. Não funciona se o programa tiver efeitos colaterais, como fazer uma chamada REST.
Albert Hendriks

Respostas:

3

Em teoria, para executar o programa para trás seria necessário desfazer quaisquer efeitos da execução do programa. Isso deve ser relativamente simples, se ineficiente, para alterações de memória, mais difícil para alterações no disco e impossível para a rede. E se o código depender de qualquer estado externo (hora do dia, arquivo no disco que pode ser modificado por outro processo), rebobinar e executá-lo novamente não produzirá o mesmo resultado.

Na prática, o que é possível é permitir que você observe o estado do programa em algum momento de sua execução, mas sem permitir que você reinicie a partir desse ponto. Dessa forma, não há problemas com o estado externo, porque essa forma de rebobinar não precisa desfazer nenhuma alteração de estado (exceto a memória) e avançar sempre produzirá o mesmo resultado (porque o código não é realmente executado novamente). Essa forma de rebobinagem é implementada no Visual Studio, com o nome Depuração Histórica , embora não registre o estado do programa em todas as instruções ou linhas de código, apenas em todas as chamadas de métodos.

svick
fonte