This is an add-on, non-normative documentation describing how to use the Truffle Debugger API - e.g. how to create your own debugger frontend for any Truffle language implementation.

Should I request a DebuggerSession as late or as early as possible?

Creating an empty DebuggerSession without breakpoints and no suspensions will not cause any peak performance degradation. It will however create wrappers for statements that were executed once. This means that having a debugger session open will cause overhead in memory consumption and first-execution/interpreter performance. If there is a chance that the session will not be used, then I would open it as late as possible. If you are going to need it anyway, then I would open it as early as possible.

Can I use multiple sessions to handle different entities actors/threads/etc. separately from each other?

It might not make much sense to have multiple interactive debugging sessions, but the debugging framework is not limited to interactive debugging. Also automated tools that use the debugging framework can coexist with an interactive debugger. That's what sessions were designed for. Also since the Debugger is a singleton for a PolyglotEngine, we isolate users from each other using sessions.

Should I create a session for each actor when I instantiate one?

You should use only one session, but register multiple breakpoints with different conditions that scope your breakpoint. You can use SuspendedEvent.getBreakpoints() to find out which breakpoints were actually hit.