]> granicus.if.org Git - esp-idf/commitdiff
idf_monitor: Aggressively clean up any interactive gdb session
authorAngus Gratton <angus@espressif.com>
Thu, 1 Feb 2018 01:58:58 +0000 (09:58 +0800)
committerAngus Gratton <gus@projectgus.com>
Thu, 1 Feb 2018 06:05:53 +0000 (14:05 +0800)
At least on Linux, this can get stuck sometimes and cause terminal weirdness.

tools/idf_monitor.py

index ccaddffa138a7cef6dfc6b8562313f916cf9fc2e..2bf2a9d2385b636f75f501d3502491f60248dca5 100755 (executable)
@@ -443,13 +443,25 @@ class Monitor(object):
         with self:  # disable console control
             sys.stderr.write(ANSI_NORMAL)
             try:
-                subprocess.call(["%sgdb" % self.toolchain_prefix,
+                process = subprocess.Popen(["%sgdb" % self.toolchain_prefix,
                                 "-ex", "set serial baud %d" % self.serial.baudrate,
                                 "-ex", "target remote %s" % self.serial.port,
                                 "-ex", "interrupt",  # monitor has already parsed the first 'reason' command, need a second
                                 self.elf_file], cwd=".")
+                process.wait()
             except KeyboardInterrupt:
                 pass  # happens on Windows, maybe other OSes
+            finally:
+                try:
+                    # on Linux, maybe other OSes, gdb sometimes seems to be alive even after wait() returns...
+                    process.terminate()
+                except:
+                    pass
+                try:
+                    # also on Linux, maybe other OSes, gdb sometimes exits uncleanly and breaks the tty mode
+                    subprocess.call(["stty", "sane"])
+                except:
+                    pass  # don't care if there's no stty, we tried...
             self.prompt_next_action("gdb exited")
 
     def output_enable(self, enable):