Feature Request: Push debugger activation to first breakpoint hit instead of `require "debug"`
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 35/100
Rechercherichtung
Start by reading lib/debug.rb and the Kernel#debugger implementation in lib/debug/session.rb, then trace how require "debug", require "debug/prelude", and the open variants initialize sessions. Verify the proposed behavior against activation, TracePoint, thread, UI, and forking-message concerns described in the issue. Done means requiring debug is passive while the first breakpoint activates the debugger without changing the open variants.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Proposal
require "debug"won't activate the debugger. Debugger will only be activated when the first breakpoint is triggered.require "debug"will be the same asrequire "debug/prelude"
require "debug/open"andrequire "debug/open_nonstop"'s behaviour will remain the same.
Why
Side-effects
In apps that have Bundler.require, like most Rails apps, having gem "debug" in Gemfile means the debug gem is always activated when the app is booted.
However, with the debugger's activation, many things will happen in the background:
- Additional
TracePoints would be enabled (example) - A new thread will be spawned
- Additional computation and object allocation that come with the above
To most apps, having them in the background doesn't make a huge difference. But to some, having the debugger activated causes tests to fail.
For example, I tested 5 mid-to-large Rails apps in Shopify, and 3 of them have test failures that only happen when debug is activated:
- Some tests mock
File.readlinesand could break when this line is triggered in the background. - There's also weird
NoMethodErrorexceptions that only happens with the debugger activated.
Therefore, we always have require: false after gem "debug".
Problem Solved?
However, having require: false means users need to manually type require "debug" before start debugging with console. But in the meantime, byebug can be required by default without the same side-effects. So byebug doesn't need that manual require.
This extra require step is quite inconvenient for people considering switching from byebug to debug.
Other Smaller Issues
- The activation and forking messages are noisy and disabling them project-by-project is not trivial.
require "debug"locks the UI to console, so if users want to use the remote UI by requiringdebug/openafter the app is booted,require: falseis also needed.
Possible Change
diff --git a/lib/debug.rb b/lib/debug.rb
index 15ebccb..3489268 100644
--- a/lib/debug.rb
+++ b/lib/debug.rb
@@ -1,5 +1,3 @@
# frozen_string_literal: true
require_relative 'debug/session'
-return unless defined?(DEBUGGER__)
-DEBUGGER__::start no_sigint_hook: true, nonstop: true
diff --git a/lib/debug/session.rb b/lib/debug/session.rb
index a900f89..ffb2604 100644
--- a/lib/debug/session.rb
+++ b/lib/debug/session.rb
@@ -2486,7 +2486,9 @@ end
module Kernel
def debugger pre: nil, do: nil, up_level: 0
- return if !defined?(::DEBUGGER__::SESSION) || !::DEBUGGER__::SESSION.active?
+ if !defined?(::DEBUGGER__::SESSION) || !::DEBUGGER__::SESSION.active?
+ DEBUGGER__::start no_sigint_hook: true, nonstop: true
+ end
if pre || (do_expr = binding.local_variable_get(:do))
cmds = ['binding.break', pre, do_expr]
- Vorherrschende Sprache
- Ruby
- Sterne
- 1.3k
- Forks
- 146
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus ruby/debug
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 68/100
-
Support exceptionOptions in setExceptionBreakpoints to catch arbitrary exception classes via DAP Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 55/100
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 45/100
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 52/100
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
Ähnliche Issues
-
SyncEm always forwards a dummy block, so wrapped methods lose their no-block/Enumerator behavior Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
endoflife-date/endoflife.date#11086 ·
-
internal
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
Kong/developer.konghq.com#7322 ·
-
bug P2
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100