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
Crash if clicking on any difficulty control point in editor SingleThreaded #9952
Comments
I'm thoroughly confused. Are you running a custom release? That's not english and we don't have localisation support. Please reports bugs using official releases in the future. |
Sorry for this.
|
Still crashed |
Weirdly enough, following the same procedure as in your video this doesn't crash here. Somehow the precision of a bindable somewhere it getting set to zero. I've had a look through the framework-side logic and can't find how this could happen yet. |
A few sanity checks:
|
|
Can you check if this crash exactly occurs when clicking on any difficulty control point? i.e. do you get a crash in both of the below procedures:
Or do you get a crash for one but not the other? |
Clicking the base BPM doesn't crash. |
Thanks for this information, I can reproduce the issue now (requires setting to single thread mode), will investigate further in a bit. Interesting thing is that it's only reproducible in a Windows OS, can't reproduce it here on my mac. |
@smoogipoo will probably need your feedback on the best path forward here. the editor controls are binding to control points which transfers precision. i'm not sure that's what we want, but the raises the question of whether we should just not be binding in the first place, or setting a precision at bind time? also this looks like a screwed up precision thing, potentially requiring a framework fix..? |
That indeed does look like a framework bug. Weird because |
Ignoring that, the more important question is the one above it: how should we go about avoiding the transfer of that legacy precision set? |
Maybe either reset the precision (probably not a good idea since you're mangling the timing points immediately) or decouple the slider bars. |
The whole point of making control points bindable was for this purpose, so decoupling seems very wrong. Are we sure legacy needs a precision of epsilon? It's a pity there's no inline documentation as for why that is necessary / examples of where it's used. |
Have you tried removing it? We definitely have at least one test case that should fail. |
For what it's worth the epsilon precision does fail a test (
|
yep, and still fails at 0.01 and 0.001. going to need to think about this one a bit more. a framework side fix for the precision crash will alleviate the hard crash at least. just means the slider bar will allow more precise setting for legacy points (not such a huge deal). |
this is going to sound silly, but can I get a roll call of the CPU make & model of everyone who has been able to reproduce this? I'm on an Intel Core i7-6700HQ - interested if everyone else is also replicating this on intel, and if other CPUs (AMD) are also affected I normally wouldn't go on such a limb but I've spent the evening looking at this with visual studio and the disassembly window and this looks very wrong (this is deep in .NET intrinsics, namely |
Can reproduce on Intel Core i5-4570. |
AMD Ryzen 7 3700X user, able to reproduce |
ok, that's enough to rule this out as vendor-specific, thanks; next best bet is probably some issue with .NET Core's intrinsics. possibly the MXCSR register is misconfigured in one of these cases, but that discussion is probably best not continued here. I'll continue investigating on my own. |
I am almost certain I found what causes the bogus comparison, although I don't have absolutely 100% of the puzzle. I am 99% sure is that this is indeed related to the As for what causes that, it seems that most likely one of the BASS P/Invokes changes that register's value, and does not restore it to its previous state. In multi-threaded mode this is fine, as the register's value looks to be local to the thread (or the CLR restores it in some manner, not sure), but in single-threaded mode the change pollutes the entire main thread's flags, therefore causing bogus comparisons like the one above. This is unconfirmed, as I can't seem to get windbg to breakpoint conditionally on a register value; I essentially haven't caught the bug red-handed. However, I tentatively confirmed it in two ways:
Edit: Here's a definitive video. Tried to step through it in VS's disassembler but something looks real funky. The value changes after a |
May be good to shoehorn the pinvoke to If it can still be reproduced with manual pinvokes, then next step would be to inform un4seen (their forum is good). |
I think I can do even better, here's a run-of-the-mill C# console application showing the same thing. Output on my machine is:
The register flags change at the Edit: Here's the offending instruction. Seems to be coming from somewhere in MSVC. |
Good stuff. The MSVC ones look to be functions to set the FP control. So really it's I think this is enough to take it to un4seen. |
Describe the crash:
When trying to edit any difficulty control point in any beatmap with SingleThread mode game crashed.
Screenshots or videos showing encountered issue:
https://www.youtube.com/watch?v=Ep8vINZxbtA
osu!lazer version:
2020.820.0
Logs:
runtime.log
A part of runtime.log:
Computer Specifications:
CPU i7-9750H
32GB RAM
RTX2070
The text was updated successfully, but these errors were encountered: