changeset 15223:0e7615548cef v8.1.0621

patch 8.1.0621: terminal debugger does not handle unexpected debugger exit commit https://github.com/vim/vim/commit/ef3c6a5b023723a5f6eec47328cf7139c2048f8c Author: Bram Moolenaar <Bram@vim.org> Date: Sat Dec 22 15:14:49 2018 +0100 patch 8.1.0621: terminal debugger does not handle unexpected debugger exit Problem: Terminal debugger does not handle unexpected debugger exit. Solution: Check for debugger job ended and close unused buffers. (Damien)
author Bram Moolenaar <Bram@vim.org>
date Sat, 22 Dec 2018 15:15:04 +0100
parents c4a379734f18
children 4a29954f3941
files runtime/pack/dist/opt/termdebug/plugin/termdebug.vim src/version.c
diffstat 2 files changed, 19 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
@@ -142,6 +142,13 @@ func s:StartDebug_internal(dict)
   endif
 endfunc
 
+" Use when debugger didn't start or ended.
+func s:CloseBuffers()
+  exe 'bwipe! ' . s:ptybuf
+  exe 'bwipe! ' . s:commbuf
+  unlet! s:gdbwin
+endfunc
+
 func s:StartDebug_term(dict)
   " Open a terminal window without a job, to run the debugged program in.
   let s:ptybuf = term_start('NONE', {
@@ -181,13 +188,11 @@ func s:StartDebug_term(dict)
   let cmd = [g:termdebugger, '-quiet', '-tty', pty] + gdb_args
   call ch_log('executing "' . join(cmd) . '"')
   let s:gdbbuf = term_start(cmd, {
-        \ 'exit_cb': function('s:EndTermDebug'),
         \ 'term_finish': 'close',
         \ })
   if s:gdbbuf == 0
     echoerr 'Failed to open the gdb terminal window'
-    exe 'bwipe! ' . s:ptybuf
-    exe 'bwipe! ' . s:commbuf
+    call s:CloseBuffers()
     return
   endif
   let s:gdbwin = win_getid(winnr())
@@ -204,6 +209,13 @@ func s:StartDebug_term(dict)
   " why the debugger doesn't work.
   let try_count = 0
   while 1
+    let gdbproc = term_getjob(s:gdbbuf)
+    if gdbproc == v:null || job_status(gdbproc) !=# 'run'
+      echoerr string(g:termdebugger) . ' exited unexpectedly'
+      call s:CloseBuffers()
+      return
+    endif
+
     let response = ''
     for lnum in range(1,200)
       if term_getline(s:gdbbuf, lnum) =~ 'new-ui mi '
@@ -211,8 +223,7 @@ func s:StartDebug_term(dict)
         let response = term_getline(s:gdbbuf, lnum) . term_getline(s:gdbbuf, lnum + 1)
         if response =~ 'Undefined command'
           echoerr 'Sorry, your gdb is too old, gdb 7.12 is required'
-          exe 'bwipe! ' . s:ptybuf
-          exe 'bwipe! ' . s:commbuf
+	  call s:CloseBuffers()
           return
         endif
         if response =~ 'New UI allocated'
@@ -243,6 +254,7 @@ func s:StartDebug_term(dict)
   " "Type <return> to continue" prompt.
   call s:SendCommand('set pagination off')
 
+  call job_setoptions(gdbproc, {'exit_cb': function('s:EndTermDebug')})
   call s:StartDebugCommon(a:dict)
 endfunc
 
--- a/src/version.c
+++ b/src/version.c
@@ -800,6 +800,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    621,
+/**/
     620,
 /**/
     619,