I work on a codebase daily that has multiple threads per app, and two event loops.
We have successfully sorted out how to manage both loops, and set effective breakpoints to debug efficiently. We also log extensively.
I know it’s possible because I do it every day.
(Well, other than my own conditional breakpoint features built into the code, doing things like programmatically trigger a breakpoint whenever an object with a specific address (that being settable in the debugger interactively) passes certain points in the garbage collector.)