효과적인 루비 디버깅을 위해 여러 도구와 기법이 소개됩니다. 먼저, Ruby LSP 확장을 활용하는 것이 강조됩니다. debug.gem
과의 연결을 위해 launch.json
설정을 attach
대신 launch
요청으로 변경하여 서버를 수동으로 시작/중지할 필요 없이 디버깅 프로세스를 단순화할 수 있습니다. 또한, Ruby LSP의 Code Lens 기능을 통해 터미널과 VS Code 모두에서 테스트를 쉽게 디버깅할 수 있으며, 특히 RSpec 테스트를 위한 ruby-lsp-rspec
의 사용이 권장됩니다.
debug.gem
의 최적화된 사용법도 중요하게 다뤄집니다. Gemfile
에서 gem "debug", require: "debug/prelude"
를 사용하여 필요한 경우에만 디버거가 활성화되도록 설정함으로써 불필요한 리소스 소모를 방지할 수 있습니다. 이는 Rails 7.2부터 새로 생성된 Rails 프로젝트의 기본 설정이기도 합니다. 특정 환경, 예를 들어 CI 환경에서 debug.gem
의 사용을 막으려면 RUBY_DEBUG_ENABLE
환경 변수를 0
으로 설정할 수 있습니다. 이는 debugger
또는 binding.break
가 무한정 중단되는 대신 오류를 발생시키도록 합니다.
디버깅 시 특정 젬을 무시하도록 debug.gem
을 구성하는 방법도 제시됩니다. DEBUGGER__::CONFIG[:skip_path]
를 사용하여 zeitwerk
, bootsnap
, 그리고 Sorbet을 사용하는 경우 sorbet-runtime
와 같은 젬의 경로를 추가하여 불필요한 디버깅 진입을 피할 수 있습니다. 대부분의 사용자에게는 RUBY_DEBUG_IRB_CONSOLE
을 1
로 설정하거나 DEBUGGER__::CONFIG[:irb_console]
을 true
로 설정하여 debug.gem
과 IRB의 통합을 활성화하는 것이 더 나은 디버깅 경험을 제공합니다.
debug.gem
의 특정 명령(step, next, continue, finish, until, up, down)은 엔터 키를 누르면 반복 실행되는 편리한 기능을 제공합니다. 또한, debugger(do: "...")
또는 debugger(pre: "...")
를 사용하여 중단점에 도달한 후 자동으로 명령을 실행할 수 있어 디버깅 흐름을 자동화하는 데 유용합니다.
제어 흐름 관련 버그를 디버깅할 때는 trace exception
과 catch [exception]
명령의 조합이 효과적입니다. trace exception
은 예외가 발생할 때 추적 정보를 출력하고, catch [exception]
은 특정 예외 발생 시 중단점을 설정합니다. 동일한 코드 경로에 여러 중단점을 설정하는 것보다 bt [n]
(백트레이스)과 up/down
명령을 조합하여 사용하는 것이 더 효율적일 수 있습니다. 더 세밀한 추적을 위해서는 tracer
젬을 활용할 수 있습니다. 마지막으로, debug.gem
이 중단점에 진입할 때 모든 실행 중인 스레드를 정지시키는 문제가 발생할 경우, binding.irb
를 대안으로 사용하여 REPL을 열고 필요할 때 debug
명령으로 debug.gem
을 활성화하는 방법을 제안합니다.