changeset 14143:2aec369c4fc3 v8.1.0089

patch 8.1.0089: error when ending the terminal debugger commit https://github.com/vim/vim/commit/a15b0a936d2013e99e9323da9b920a5d93e4fb5a Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jun 19 22:34:46 2018 +0200 patch 8.1.0089: error when ending the terminal debugger Problem: error when ending the terminal debugger Solution: Fix deleting defined signs for breakpoints. Make the debugger work better on MS-Windows.
author Christian Brabandt <cb@256bit.org>
date Tue, 19 Jun 2018 22:45:05 +0200
parents fa3b1a61186f
children 50f0119f4dda
files runtime/pack/dist/opt/termdebug/plugin/termdebug.vim src/version.c
diffstat 2 files changed, 32 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
@@ -408,7 +408,7 @@ func s:GdbOutCallback(channel, text)
 
   " Drop the gdb prompt, we have our own.
   " Drop status and echo'd commands.
-  if a:text == '(gdb) ' || a:text == '^done' || a:text[0] == '&' || a:text[0] == '='
+  if a:text == '(gdb) ' || a:text == '^done' || a:text[0] == '&'
     return
   endif
   if a:text =~ '^^error,msg='
@@ -439,7 +439,7 @@ endfunc
 " to the next ", unescaping characters.
 func s:DecodeMessage(quotedText)
   if a:quotedText[0] != '"'
-    echoerr 'DecodeMessage(): missing quote'
+    echoerr 'DecodeMessage(): missing quote in ' . a:quotedText
     return
   endif
   let result = ''
@@ -459,6 +459,16 @@ func s:DecodeMessage(quotedText)
   return result
 endfunc
 
+" Extract the "name" value from a gdb message with fullname="name".
+func s:GetFullname(msg)
+  let name = s:DecodeMessage(substitute(a:msg, '.*fullname=', '', ''))
+  if has('win32') && name =~ ':\\\\'
+    " sometimes the name arrives double-escaped
+    let name = substitute(name, '\\\\', '\\', 'g')
+  endif
+  return name
+endfunc
+
 func s:EndTermDebug(job, status)
   exe 'bwipe! ' . s:commbuf
   unlet s:gdbwin
@@ -639,9 +649,13 @@ func s:DeleteCommands()
   for key in keys(s:breakpoints)
     exe 'sign unplace ' . (s:break_id + key)
   endfor
+  unlet s:breakpoints
+
   sign undefine debugPC
-  sign undefine debugBreakpoint
-  unlet s:breakpoints
+  for val in s:BreakpointSigns
+    exe "sign undefine debugBreakpoint" . val
+  endfor
+  unlet s:BreakpointSigns
 endfunc
 
 " :Break - Set a breakpoint at the cursor position.
@@ -660,8 +674,9 @@ func s:SetBreakpoint()
     endif
     sleep 10m
   endif
-  call s:SendCommand('-break-insert --source '
-	\ . fnameescape(expand('%:p')) . ' --line ' . line('.'))
+  " Use the fname:lnum format, older gdb can't handle --source.
+  call s:SendCommand('-break-insert '
+	\ . fnameescape(expand('%:p')) . ':' . line('.'))
   if do_continue
     call s:SendCommand('-exec-continue')
   endif
@@ -790,7 +805,11 @@ func s:HandleCursor(msg)
 
   call s:GotoSourcewinOrCreateIt()
 
-  let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
+  if a:msg =~ 'fullname='
+    let fname = s:GetFullname(a:msg)
+  else
+    let fname = ''
+  endif
   if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
     let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
     if lnum =~ '^[0-9]*$'
@@ -816,13 +835,12 @@ func s:HandleCursor(msg)
   call win_gotoid(wid)
 endfunc
 
+let s:BreakpointSigns = []
+
 func s:CreateBreakpoint(nr)
-  if !exists("s:BreakpointSigns")
-    let s:BreakpointSigns = []
-  endif
   if index(s:BreakpointSigns, a:nr) == -1
     call add(s:BreakpointSigns, a:nr)
-    exe "sign define debugBreakpoint". a:nr . " text=" . a:nr . " texthl=debugBreakpoint"
+    exe "sign define debugBreakpoint" . a:nr . " text=" . a:nr . " texthl=debugBreakpoint"
   endif
 endfunc
 
@@ -842,7 +860,7 @@ func s:HandleNewBreakpoint(msg)
     let s:breakpoints[nr] = entry
   endif
 
-  let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
+  let fname = s:GetFullname(a:msg)
   let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
   let entry['fname'] = fname
   let entry['lnum'] = lnum
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    89,
+/**/
     88,
 /**/
     87,