diff --git a/lib/irb/cmd/debug.rb b/lib/irb/cmd/debug.rb index 369c11225..d43e060c6 100644 --- a/lib/irb/cmd/debug.rb +++ b/lib/irb/cmd/debug.rb @@ -48,8 +48,8 @@ def setup_debugger unless defined?(DEBUGGER__::SESSION) begin require "debug/session" - rescue LoadError - return false + rescue LoadError # debug.gem is not written in Gemfile + return false unless load_bundled_debug_gem end DEBUGGER__.start(nonstop: true) end @@ -68,6 +68,29 @@ def DEBUGGER__.capture_frames(*args) true end + + # This is used when debug.gem is not written in Gemfile. Even if it's not + # installed by `bundle install`, debug.gem is installed by default because + # it's a bundled gem. This method tries to activate and load that. + def load_bundled_debug_gem + # Discover latest debug.gem under GEM_PATH + debug_gem = Gem.paths.path.map { |path| Dir.glob("#{path}/gems/debug-*") }.flatten.select do |path| + File.basename(path).match?(/\Adebug-\d+\.\d+\.\d+\z/) + end.sort_by do |path| + Gem::Version.new(File.basename(path).delete_prefix('debug-')) + end.last + return false unless debug_gem + + # Attempt to forcibly load the bundled gem + $LOAD_PATH << "#{debug_gem}/lib" + begin + require "debug/session" + puts "Loaded #{File.basename(debug_gem)}" + true + rescue LoadError + false + end + end end end end