Unikernels are unfit for production
&gt; Unikernels are entirely undebuggable<p>I&#x27;m pretty sure you debug an Erlang-on-Xen node in the same way you debug a regular Erlang node. You use the (excellent) Erlang tooling to connect to it, and interrogate it&#x2F;trace it&#x2F;profile it&#x2F;observe it&#x2F;etc. The Erlang runtime <i>is</i> an OS, in every sense of the word; running Erlang on Linux is truly just <i>redundant</i>, since you&#x27;ve already got all the OS you need. That&#x27;s what justifies making an Erlang app a unikernel.<p>But that&#x27;s an argument coming from the perspective of someone tasked with maintaining persistent long-running instances. When you&#x27;re in that sort of situation, you <i>need</i> the sort of things an OS provides. And that&#x27;s actually rather rare.<p>The true &quot;good fit&quot; use-case of Unikernels is in immutable infrastructure. You <i>don&#x27;t</i> debug a unikernel, mostly; you just kill and replace it (you &quot;let it crash&quot;, in Erlang terms.) Unikernels are a formalization of the (already prevalent) use-case where you launch some ephemeral VMs or containers as a static, mostly-internally-stateless &quot;release slug&quot; of your application tier, and then roll out an upgrade by starting up new &quot;slugs&quot; and terminating old ones. You can&#x27;t really &quot;debug&quot; those (except via instrumentation compiled into your app, ala NewRelic.) They&#x27;re black boxes. A unikernel just statically links the whole black box together.<p>Keep in mind, &quot;debugging&quot; is two things: development-time debugging and production-time debugging. It&#x27;s only the latter that unikernels are fundamentally bad at. For dev-time debugging, both MirageOS and Erlang-on-Xen come with ways to compile your app as an OS process rather than as a VM image. When you are trying to <i>integration-test</i> your app, you integration-test the process version of it. When you&#x27;re trying to <i>smoke-test</i> your app, you can still use the process version—or you can launch (an instrumented copy of) the VM image. Either way, it&#x27;s no harder than dev-time debugging of a regular non-unikernel app.