diff --git a/garnet/lib/inferior_control/test_helper.cc b/garnet/lib/inferior_control/test_helper.cc
index 60635fe..4f84e8a 100644
--- a/garnet/lib/inferior_control/test_helper.cc
+++ b/garnet/lib/inferior_control/test_helper.cc
@@ -6,12 +6,15 @@
 #include <cstring>
 #include <thread>
 
+#include <lib/fxl/command_line.h>
+#include <lib/fxl/log_settings.h>
+#include <lib/fxl/log_settings_command_line.h>
+#include <lib/zx/event.h>
+#include <lib/zx/port.h>
 #include <zircon/process.h>
 #include <zircon/processargs.h>
 #include <zircon/syscalls.h>
 #include <zircon/syscalls/port.h>
-#include <lib/zx/event.h>
-#include <lib/zx/port.h>
 
 #include "garnet/lib/debugger_utils/breakpoints.h"
 #include "garnet/lib/debugger_utils/util.h"
@@ -113,29 +116,31 @@
 }
 
 int main(int argc, char* argv[]) {
-  if (argc > 2) {
-    fprintf(stderr, "Usage: %s [command]\n", argv[0]);
+  auto cl = fxl::CommandLineFromArgcArgv(argc, argv);
+  if (!fxl::SetLogSettingsFromCommandLine(cl)) {
     return 1;
   }
 
-  zx_handle_t channel = zx_take_startup_handle(PA_HND(PA_USER0, 0));
-  // If no channel was passed we're running standalone.
-  if (channel == ZX_HANDLE_INVALID) {
-    FXL_LOG(INFO) << "No handle provided";
-  }
+  const std::vector<std::string>& args = cl.positional_args();
 
-  if (argc == 2) {
-    const char* cmd = argv[1];
-    if (strcmp(cmd, "wait-peer-closed") == 0) {
+  if (!args.empty()) {
+    zx_handle_t channel = zx_take_startup_handle(PA_HND(PA_USER0, 0));
+    // If no channel was passed we're running standalone.
+    if (channel == ZX_HANDLE_INVALID) {
+      FXL_LOG(WARNING) << "No handle provided";
+    }
+
+    const std::string& cmd = args[0];
+    if (cmd == "wait-peer-closed") {
       return PerformWaitPeerClosed(channel);
     }
-    if (strcmp(cmd, "trigger-sw-bkpt") == 0) {
+    if (cmd == "trigger-sw-bkpt") {
       return TriggerSoftwareBreakpoint(channel, false);
     }
-    if (strcmp(cmd, "trigger-sw-bkpt-with-handler") == 0) {
+    if (cmd == "trigger-sw-bkpt-with-handler") {
       return TriggerSoftwareBreakpoint(channel, true);
     }
-    fprintf(stderr, "Unrecognized command: %s\n", cmd);
+    FXL_LOG(ERROR) << "Unrecognized command: " << cmd;
     return 1;
   }
 
diff --git a/garnet/lib/inferior_control/test_server.cc b/garnet/lib/inferior_control/test_server.cc
index 05ab0ce..33bd0ab 100644
--- a/garnet/lib/inferior_control/test_server.cc
+++ b/garnet/lib/inferior_control/test_server.cc
@@ -9,6 +9,7 @@
 #include <string>
 #include <vector>
 
+#include <lib/fxl/log_settings_command_line.h>
 #include <lib/fxl/logging.h>
 #include <lib/fxl/strings/string_printf.h>
 #include <lib/sys/cpp/service_directory.h>
@@ -35,6 +36,13 @@
 }
 
 void TestServer::TearDown() {
+  // Before we close the exception port, make sure we've detached.
+  Process* inferior = current_process();
+  if (inferior && inferior->IsAttached()) {
+    inferior->Kill();
+    inferior->Detach();
+  }
+
   if (exception_port_started_) {
     // Tell the exception port to quit and wait for it to finish.
     exception_port_.Quit();
@@ -46,9 +54,10 @@
 
 bool TestServer::Run() {
   // Start the main loop.
-  message_loop_.Run();
+  zx_status_t status = message_loop_.Run();
 
-  FXL_LOG(INFO) << "Main loop exited";
+  FXL_LOG(INFO) << "Main loop exited, status "
+                << debugger_utils::ZxErrorString(status);
 
   // |run_status_| is checked by TearDown().
   return true;
@@ -56,7 +65,14 @@
 
 bool TestServer::SetupInferior(const std::vector<std::string>& argv) {
   auto inferior = new Process(this, this, services_);
-  inferior->set_argv(argv);
+
+  // Transfer our log settings to the inferior.
+  std::vector<std::string> inferior_argv{argv};
+  for (auto arg : fxl::LogSettingsToArgv(fxl::GetLogSettings())) {
+    inferior_argv.push_back(arg);
+  }
+  inferior->set_argv(inferior_argv);
+
   // We take over ownership of |inferior| here.
   set_current_process(inferior);
   return true;
@@ -101,6 +117,8 @@
     return false;
   }
   if (inferior->IsAttached()) {
+    // The program should have terminated some how, in which case we would
+    // have detached. So it's likely the program is still running.
     FXL_LOG(ERROR) << "inferior still attached";
     return false;
   }
@@ -126,6 +144,8 @@
     return false;
   }
   if (inferior->IsAttached()) {
+    // The program should have terminated some how, in which case we would
+    // have detached. So it's likely the program is still running.
     FXL_LOG(ERROR) << "inferior still attached";
     return false;
   }
@@ -171,8 +191,9 @@
 void TestServer::OnProcessTermination(Process* process) {
   FXL_DCHECK(process);
 
-  printf("Process %s is gone, rc %d\n", process->GetName().c_str(),
-         process->return_code());
+  FXL_LOG(INFO) << fxl::StringPrintf("Process %s is gone, rc %d",
+                                     process->GetName().c_str(),
+                                     process->return_code());
 
   // Process is gone, exit main loop.
   PostQuitMessageLoop(true);
