1 pontos por GN⁺ 2024-07-22 | 1 comentários | Compartilhar no WhatsApp
  • Introdução ao rr

    • rr é uma ferramenta de depuração para C/C++ no Linux, criada para complementar o gdb
    • É possível registrar uma falha uma única vez e depurá-la repetidamente a partir desse registro
    • Permite depurar reproduzindo exatamente a mesma execução todas as vezes
    • Oferece execução reversa eficiente por meio do gdb
  • Recursos do rr

    • Baixo overhead
    • Suporte para gravação e reprodução de vários aplicativos (Firefox, Chrome, QEMU, LibreOffice etc.)
    • Permite gravar, reproduzir e depurar cargas de trabalho com múltiplos processos
    • Suporte a scripts do gdb e integração com IDEs
    • Arquivos de rastreamento duráveis e compactados, que podem ser movidos entre máquinas
    • Oferece um modo de caos para reproduzir bugs intermitentes
  • Experiência de depuração com rr

    • Gravar o aplicativo: rr record /your/application --args...
    • Depurar a execução gravada: rr replay
    • Depuração determinística do rastreamento gravado
    • É possível usar os comandos comuns do gdb
    • A execução reversa permite chegar rapidamente ao ponto do problema
  • Vídeos

    • Vídeo de demonstração de gravação e reprodução do Firefox
    • Vídeo explicando em detalhes os recursos básicos do rr
    • Vídeo de palestra técnica avançada de Robert O'Callahan
  • Primeiros passos

    • Compilar a partir do código-fonte: recomendado caso os pacotes não funcionem
    • Instruções de instalação para Fedora e Ubuntu
  • Contexto e motivação

    • Desenvolvido para facilitar a depuração de falhas intermitentes
    • Com a reprodução determinística, as informações obtidas durante a depuração permanecem válidas
    • A execução reversa torna o processo de depuração mais fácil
    • rr é usado regularmente em muitos projetos grandes e pequenos
  • Como o rr funciona

    • Registra processos em espaço de usuário no Linux e captura todas as entradas vindas do kernel
    • Na reprodução, garante o fluxo de controle no nível de instrução, além do conteúdo de memória e registradores
    • Layout de memória, endereços de objetos, valores de registradores etc. permanecem idênticos
    • Fica ainda mais poderoso quando usado com fuzzers e injetores aleatórios de falhas
  • O contexto do rr

    • Depuração com gravação e reprodução é uma ideia antiga
    • Metas de projeto com foco no Firefox
    • Facilidade de implantação: roda em kernels Linux comuns, sem exigir mudanças na configuração do sistema
    • Baixo overhead em tempo de execução
    • Projeto simples: evita técnicas complexas
  • Limitações

    • Emula uma máquina de núcleo único
    • Não é possível registrar processos que compartilham memória com algo fora da árvore de gravação
    • Requer uma CPU x86 moderna ou determinadas CPUs ARM
    • Exige conhecimento de todas as chamadas de sistema executadas pelo processo gravado
    • Exige adaptação a mudanças no kernel, atualizações de bibliotecas do sistema e novas famílias de CPU
  • Materiais adicionais

    • Relatório técnico estendido
    • Wiki do rr
    • É possível fazer perguntas na mailing list ou no canal #rr do chat.mozilla.org

Resumo do GN⁺

  • rr é uma ferramenta poderosa para depuração de C/C++ no Linux, melhorando bastante a eficiência com reprodução determinística
  • Suporta vários aplicativos e cargas de trabalho com múltiplos processos, sendo prática graças ao baixo overhead
  • O recurso de execução reversa torna o processo de depuração mais fácil
  • É útil de forma geral por conseguir depurar aplicativos complexos como o Firefox
  • Ferramentas com funções semelhantes incluem gdb e Valgrind

1 comentários

 
GN⁺ 2024-07-22
Comentários do Hacker News
  • O GDB já oferece funcionalidade de depuração reversa
  • O rr oferece mais recursos e flexibilidade
  • Houve sucesso ao usar o rr para fazer engenharia reversa em codebases grandes
  • O depurador exige uma lista de símbolos e compreensão das chamadas de sistema
  • Há curiosidade sobre se o rr também funciona com linguagens como Rust, Zig, Odin e Nim
  • Provavelmente não funcionará com linguagens de memória gerenciada como Python, JS e C#
  • Houve um projeto que tentou portar para Rust, mas foi descontinuado
  • Um estudo comparativo sobre o impacto e os benefícios de reescrever de C++ para Rust seria interessante
  • O rr é muito útil, mas muitas vezes não consegue reproduzir bugs de concorrência
  • Seria muito útil se algumas linguagens integrassem o rr diretamente às suas ferramentas
  • Depurar C/C++ com rr é muito poderoso e melhora muito o processo de depuração
  • O Pernosco é baseado em rr e adiciona um banco de dados consultável de toda a execução do programa
    • Ao clicar em um valor incorreto, ele explica imediatamente de onde aquele valor veio
    • É possível perguntar ao depurador o que realmente aconteceu sem precisar entender o código
  • Há curiosidade sobre se ele também pode ser usado quando código C/C++ é compilado como dll/so chamado a partir de Python
  • Há curiosidade sobre se os problemas do rr relacionados a CPUs Ryzen já foram resolvidos