getsentry / sentry-javascript

Official Sentry SDKs for JavaScript
https://sentry.io
MIT License
7.87k stars 1.55k forks source link

LocalVariables integration - debugger no longer works when enabled #13414

Open Bruno-DaSilva opened 3 weeks ago

Bruno-DaSilva commented 3 weeks ago

Is there an existing issue for this?

How do you use Sentry?

Sentry Saas (sentry.io)

Which SDK are you using?

@sentry/node

SDK Version

8.26.0

Framework Version

Node v20.12.2

Link to Sentry event

No response

Reproduction Example/SDK Setup


Sentry.init({
    dsn: process.env.SENTRY_DSN,
    includeLocalVariables: true,
});

Steps to Reproduce

  1. start the nodejs app with --inspect
  2. init sentry with includeLocalVariables: true
  3. connect a debugger to the process
  4. trigger a breakpoint

Expected Result

Process is paused, and can step into/over/resume the execution

Actual Result

Process appears to pause for a millisecond and then immediately resumed. I believe this is because the LocalVariablesAsync integration will resume all breakpoints immediately.

This does not appear to be documented anywhere. Is this expected behaviour?

Bruno-DaSilva commented 3 weeks ago

I'm hoping with the digging I've done to root cause these it shouldn't require a high effort repro example -- but if it's needed I can create one (it'll just take me some time that I don't immediately have).

Lms24 commented 3 weeks ago

Hey @Bruno-DaSilva thanks for writing in!

We'll look into your issue next week as this week is Hackweek at Sentry (see #13421).

lforst commented 2 weeks ago

@Bruno-DaSilva your assumption is correct in that the integration immediately continues execution when a breakpoint is hit.

timfish commented 2 weeks ago

explore whether we can avoid adding or enabling the integration when another inspector session is attached to the process.

I think the main issue is that this would only work when using --inspect-brk, where the inspector is already attached when the integration is started.

When the Chrome debugger is attached, it auto sends some commands which we might be able to detect from the responses that are sent to all connected clients.

lforst commented 2 weeks ago

I wonder if we could listen for new sessions to connect in any way and then dynamically disable the integration. :thinking:

timfish commented 2 weeks ago

It's likely possible, I just can't find a specific debugger event for new debug connections. We'd have to watch for responses that indicate a new connection has been made and these are specific responses to what the debugger sends on connection. This can vary slightly depending on how the debugger is configured.

Bruno-DaSilva commented 2 weeks ago

In the worst case, could we have some sort of manual trigger to enable/disable the LocalVariables integration on the fly?

In a non-local workflow we perform some extra manual steps when we are eg. connecting to debug a pod in kubernetes (namely kill -SIGUSR1 {pid} to enable debugging - see this). So perhaps something similar could be used to disable the LocalVariables integration?

timfish commented 2 weeks ago

We could check process.execArgv for --inspect which would cover a lot of cases. It's still possible to enable the debugger via thge inspector api but I suspect this is rarely used for manual debugging.

Bruno-DaSilva commented 2 weeks ago

We could check process.execArgv for --inspect which would cover a lot of cases.

You mean disable the integration outright at startup if it sees the --inspect flag?

timfish commented 2 weeks ago

disable the integration outright at startup if it sees the --inspect flag?

Yep, that would be the easiest solution.

There is a Debugger.detached event but unfortunately nothing for attached. When a new debugger connects we see repeated Debugger.scriptParsed events so we could also use those.