-
Notifications
You must be signed in to change notification settings - Fork 52
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DevTools hangs with high CPU usage when a breakpoint is hit while debugging my company's React code. #275
Comments
Thank you for filing. I will make sure this shows up on our dev team's backlog. |
Hi @gzx-miller , I'm Rob Paveza, an Engineering Manager on the DevTools team. Without knowing a lot about your project, I wanted to ask about one case in which we've often seen this. Is your build system configured to use something like Some background: some build systems like Webpack provide this as a mechanism to support Hot Module Replacement. In short, suppose you have a single TypeScript file like this: export function add(a: number, b: number): number {
return a + b;
} A conventional way to bundle and minify this might look like this: export const add=(a,b)=>a+b; Setting aside the issue of minification, what ends up happening to support HMR with eval(`function add(a, b) { return a + b; }
return { add };
`); That is approximately semantically equivalent modulo ES modules behavior, and it allows the module to be swapped at runtime by changing the object representing the module. But this produces a terrible debugging experience. So the folks who did that added source maps to it: eval(`function add(a, b) { return a + b; }
return { add };
// #sourceMappingURL=data:text/json;base64,ej...
`);
// #sourceMappingURL=data:text/json;base64,ej... So now you see that the source map is base-64 encoded JSON text encoded inline twice: once within the module itself, and another time within the eval. (I have quite literally seen this.) The source maps are actually germane, as well, because they represent two different scripts: the script containing the I'm not saying that this is causing your issue -- however, I have seen from an internal team that this can cause quite a bit of CPU thrashing and performance degradation. (I also saw OOM crashes from this). It is a severe problem with the HMR mechanism for large projects, so if possible, I'd like to eliminate this as a cause. |
Hi, @robpaveza , It might indeed be the cause, as I have found code related to //webpackDevServer.config.js
const evalSourceMapMiddleware = require('react-dev-utils/evalSourceMapMiddleware');
devServer.app.use(evalSourceMapMiddleware(devServer)); However, what methods can I use to bypass or fix this issue? The last question is "Why chrom and edge122 without problem?" |
I recently found that a necessary operation to trigger this phenomenon is, after hitting a breakpoint, hovering the mouse over the variable to observe its value, which will cause a hang and high CPU usage. However, as long as the variable is not inspected, I can step through the code multiple times fluently. @robpaveza @captainbrosset |
I have the same issue since some time. |
My browser hangs on breakpoint too. |
Thank you all for the details about this issue. I'll bring this back to the engineering team to help investigate. |
Same issue here, also with an Angular application, also noticed it for several months. I did notice that disabling javascript sourcemaps also removes the hang (mostly, it then needs to highlight a huge file but that's way faster still), but disabling sourcemaps alltogether isn't really an option. |
@gzx-miller @wertzui @HesamKashefi @nvdweem Can you please provide the following details to assist the engineering team's investigation:
|
Windows Edge How to reproduce:
|
Steps to reproduce
|
@HesamKashefi glad to see that you found a fix and it's working again! @wertzui are you also seeing this with Angular or just in general? @nvdweem can you try the same fix @HesamKashefi mentioned above and report back if it worked for you too? |
I had seen that workaround, that's why I included
And
In incognito, no plugins are enabled, so sadly the workaround doesn't work for me. |
@nvdweem apologies for missing that. A new version of Edge Stable recently shipped to v131. I noticed that you're seeing this bug on v130. Have you tried updating to the most recent version? |
I think my Edge updated right after posting the version (Version 131.0.2903.51 (Official build) (64-bit)) and I think I've seen the issue pop up afterwards, but I'm not entirely sure. It doesn't always trigger, but just tried a few breakpoints in and outside of InPrivate and those seemed to be interactive quite quickly. I'll try to pay attention to whether it triggers again in the coming days. Update: immediately after this message I hit a breakpoint that took ~15 seconds to become responsive again, refreshing the page and triggering it again 'only' takes ~3 seconds. |
@nvdweem I removed all of the extensions, they were already disabled when I had the issue. maybe you could try this too. I'm guessing that maybe it's from installing extensions 'from other sources' |
Also tried it with a new profile, not a single extension installed (other than a disabled Offline Google Docs extension that was already there). The first breakpoint I hit took about 10s to become responsive, the next one was instantly responsive. A breakpoint a few moments later took ~5s to become responsive. Triggering the same breakpoint in my regular profile also takes about 5s. Having following breakpoints trigger quickly feels like a cache miss on the slow triggers. I'll have to pay some more attention, but it could be that breakpoints after code-changes are slower because something (map files?) need to be reparsed or something. If disabled plugins do anything then that sounds like a way bigger problem than just unresponsive breakpoints. Edit: Tried the same breakpoint in the blank profile as a slow breakpoint in my regular profile when it was slow and it seems that the blank profile stays pretty quick. |
Steps to reproduce:
Run my company's React project for debugging:
npm run dev
The service will run, and you can access it at http://localhost:80.
Modify the
hosts
file to map127.0.0.1
toxxx.yyy.com
.You can then access the above service by opening
xxx.yyy.com
.In DevTools, locate the code and add any breakpoint that might be triggered. Then, trigger this breakpoint through an operation.
You will see that the breakpoint is effective.
For the first 1-2 seconds, DevTools is still responsive, but after that, it becomes unresponsive. You can't switch tabs or inspect variables in the call stack. Additionally, you can see that its CPU usage spikes, consuming an entire CPU core. If you resize the DevTools window, the newly exposed part of the window isn't rendered.
If you choose to close DevTools, the program resumes normal operation.
About the Edge version:
This issue did not exist in the initial version 122 of Edge. The problem appeared after I upgraded WebView2 from version 122 to 127.
I consulted with some friends at Microsoft, and they asked if the same issue occurred in Edge. At that time, my Edge version was 122, and I couldn't reproduce the issue. So, I upgraded Edge to version 127, and the problem appeared, just as it did with WebView2 version 127.
About the reproduction rate:
In my code environment, the issue has a high reproduction rate, around 90%.
I tried to reproduce the issue in a simple React project, but I couldn't.
It may require a more complex React project, and it should be running in a React debug service environment.
Unfortunately, I cannot provide my company's code, as it's not allowed to be shared.
Screen from edge devtools:
AB#53420578
The text was updated successfully, but these errors were encountered: