Fix a potential resource leakage in `_print_test_names`. (#688)

diff --git a/mobly/test_runner.py b/mobly/test_runner.py
index 84ddd34..c3c3b54 100644
--- a/mobly/test_runner.py
+++ b/mobly/test_runner.py
@@ -167,12 +167,16 @@
         test_class: module, the test module to print names from.
     """
     cls = test_class(config_parser.TestRunConfig())
+    test_names = []
     try:
         cls.setup_generated_tests()
+        test_names = cls.get_existing_test_names()
     except:
         logging.exception('Failed to retrieve generated tests.')
+    finally:
+        cls._controller_manager.unregister_controllers()
     print('==========> %s <==========' % cls.TAG)
-    for name in cls.get_existing_test_names():
+    for name in test_names:
         print(name)
 
 
diff --git a/tests/mobly/test_runner_test.py b/tests/mobly/test_runner_test.py
index 8d65336..65b9e72 100755
--- a/tests/mobly/test_runner_test.py
+++ b/tests/mobly/test_runner_test.py
@@ -360,6 +360,26 @@
                                  __main__=multiple_subclasses_module):
                 test_class = test_runner._find_test_class()
 
+    def test_print_test_names(self):
+        mock_test_class = mock.MagicMock()
+        mock_cls_instance = mock.MagicMock()
+        mock_test_class.return_value = mock_cls_instance
+        test_runner._print_test_names(mock_test_class)
+        mock_cls_instance.setup_generated_tests.assert_called_once()
+        mock_cls_instance.get_existing_test_names.assert_called_once()
+        mock_cls_instance._controller_manager.unregister_controllers.assert_called_once(
+        )
+
+    def test_print_test_names_with_exception(self):
+        mock_test_class = mock.MagicMock()
+        mock_cls_instance = mock.MagicMock()
+        mock_test_class.return_value = mock_cls_instance
+        test_runner._print_test_names(mock_test_class)
+        mock_cls_instance.setup_generated_tests.side_effect = Exception(
+            'Something went wrong.')
+        mock_cls_instance._controller_manager.unregister_controllers.assert_called_once(
+        )
+
 
 if __name__ == "__main__":
     unittest.main()