summaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-09-10 19:14:31 +0200
committerBram Moolenaar <Bram@vim.org>2017-09-10 19:14:31 +0200
commit45d5f26d11d9aac2383453d2c1a8582cad1c8a3d (patch)
tree50e00e566c2d391125927f4bbd274e3da4e2c416 /runtime
parent95c83c64be8d4af74bfda1f283a5bcf3f110719e (diff)
downloadvim-git-45d5f26d11d9aac2383453d2c1a8582cad1c8a3d.tar.gz
patch 8.0.1092: terminal debugger can't evaluate expressionsv8.0.1092
Problem: Terminal debugger can't evaluate expressions. Solution: Add :Evaluate and K. Various other improvements.
Diffstat (limited to 'runtime')
-rw-r--r--runtime/doc/terminal.txt50
-rw-r--r--runtime/pack/dist/opt/termdebug/plugin/termdebug.vim63
2 files changed, 91 insertions, 22 deletions
diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt
index 3489142ce..62182f5d0 100644
--- a/runtime/doc/terminal.txt
+++ b/runtime/doc/terminal.txt
@@ -1,4 +1,4 @@
-*terminal.txt* For Vim version 8.0. Last change: 2017 Sep 09
+*terminal.txt* For Vim version 8.0. Last change: 2017 Sep 10
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -318,11 +318,12 @@ To start debugging use `:TermDebug` folowed by the command name, for example: >
:TermDebug vim
This opens two windows:
-- A terminal window in which "gdb vim" is executed. Here you can directly
- interact with gdb. The buffer name is "!gdb".
-- A terminal window for the executed program. When "run" is used in gdb the
- program I/O will happen in this window, so that it does not interfere with
- controlling gdb. The buffer name is "gdb program".
+gdb window A terminal window in which "gdb vim" is executed. Here you
+ can directly interact with gdb. The buffer name is "!gdb".
+program window A terminal window for the executed program. When "run" is
+ used in gdb the program I/O will happen in this window, so
+ that it does not interfere with controlling gdb. The buffer
+ name is "gdb program".
The current window is used to show the source code. When gdb pauses the
source file location will be displayed, if possible. A sign is used to
@@ -334,7 +335,8 @@ to display the current gdb position.
Focus the terminal of the executed program to interact with it. This works
the same as any command running in a terminal window.
-When the debugger ends the two opened windows are closed.
+When the debugger ends, typically by typing "quit" in the gdb window, the two
+opened windows are closed.
Stepping through code ~
@@ -349,13 +351,29 @@ Put focus on the gdb window to type commands there. Some common ones are:
- frame N go to the Nth stack frame
- continue continue execution
-In the window showing the source code some commands can passed to gdb:
-- Break set a breakpoint at the current line; a sign will be displayed
-- Delete delete a breakpoint at the current line
-- Step execute the gdb "step" command
-- NNext execute the gdb "next" command (:Next is a Vim command)
-- Finish execute the gdb "finish" command
-- Continue execute the gdb "continue" command
+In the window showing the source code some commands can used to control gdb:
+ :Break set a breakpoint at the current line; a sign will be displayed
+ :Delete delete a breakpoint at the current line
+ :Step execute the gdb "step" command
+ :Over execute the gdb "next" command (:Next is a Vim command)
+ :Finish execute the gdb "finish" command
+ :Continue execute the gdb "continue" command
+
+
+Inspecting variables ~
+
+ :Evaluate evaluate the expression under the cursor
+ K same
+ :Evaluate {expr} evaluate {expr}
+ :'<,'>Evaluate evaluate the Visually selected text
+
+This is similar to using "print" in the gdb window.
+
+
+Other commands ~
+
+ :Gdb jump to the gdb window
+ :Program jump to the window with the running program
Communication ~
@@ -386,9 +404,5 @@ When 'background' is "dark":
hi debugBreakpoint term=reverse ctermbg=red guibg=red
-NOT WORKING YET: ~
-
-Values of variables can be inspected, etc.
-
vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
index 1ee887aa5..c5e4ac852 100644
--- a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
@@ -54,6 +54,7 @@ func s:StartDebug(cmd)
return
endif
let pty = job_info(term_getjob(s:ptybuf))['tty_out']
+ let s:ptywin = win_getid(winnr())
" Create a hidden terminal window to communicate with gdb
let s:commbuf = term_start('NONE', {
@@ -81,12 +82,15 @@ func s:StartDebug(cmd)
exe 'bwipe! ' . s:commbuf
return
endif
+ let s:gdbwin = win_getid(winnr())
" Connect gdb to the communication pty, using the GDB/MI interface
call term_sendkeys(gdbbuf, 'new-ui mi ' . commpty . "\r")
- " Install debugger commands.
+ " Install debugger commands in the text window.
+ call win_gotoid(s:startwin)
call s:InstallCommands()
+ call win_gotoid(s:gdbwin)
let s:breakpoints = {}
endfunc
@@ -116,10 +120,14 @@ func s:CommOutput(chan, msg)
if msg != ''
if msg =~ '^\*\(stopped\|running\)'
call s:HandleCursor(msg)
- elseif msg =~ '^\^done,bkpt='
+ elseif msg =~ '^\^done,bkpt=' || msg =~ '^=breakpoint-created,'
call s:HandleNewBreakpoint(msg)
elseif msg =~ '^=breakpoint-deleted,'
call s:HandleBreakpointDelete(msg)
+ elseif msg =~ '^\^done,value='
+ call s:HandleEvaluate(msg)
+ elseif msg =~ '^\^error,msg='
+ call s:HandleError(msg)
endif
endif
endfor
@@ -130,9 +138,15 @@ func s:InstallCommands()
command Break call s:SetBreakpoint()
command Delete call s:DeleteBreakpoint()
command Step call s:SendCommand('-exec-step')
- command NNext call s:SendCommand('-exec-next')
+ command Over call s:SendCommand('-exec-next')
command Finish call s:SendCommand('-exec-finish')
command Continue call s:SendCommand('-exec-continue')
+ command -range -nargs=* Evaluate call s:Evaluate(<range>, <q-args>)
+ command Gdb call win_gotoid(s:gdbwin)
+ command Program call win_gotoid(s:ptywin)
+
+ " TODO: can the K mapping be restored?
+ nnoremap K :Evaluate<CR>
endfunc
" Delete installed debugger commands in the current window.
@@ -140,9 +154,21 @@ func s:DeleteCommands()
delcommand Break
delcommand Delete
delcommand Step
- delcommand NNext
+ delcommand Over
delcommand Finish
delcommand Continue
+ delcommand Evaluate
+ delcommand Gdb
+ delcommand Program
+
+ nunmap K
+ sign undefine debugPC
+ sign undefine debugBreakpoint
+ exe 'sign unplace ' . s:pc_id
+ for key in keys(s:breakpoints)
+ exe 'sign unplace ' . (s:break_id + key)
+ endfor
+ unlet s:breakpoints
endfunc
" :Break - Set a breakpoint at the cursor position.
@@ -171,6 +197,35 @@ func s:SendCommand(cmd)
call term_sendkeys(s:commbuf, a:cmd . "\r")
endfunc
+" :Evaluate - evaluate what is under the cursor
+func s:Evaluate(range, arg)
+ if a:arg != ''
+ let expr = a:arg
+ elseif a:range == 2
+ let pos = getcurpos()
+ let reg = getreg('v', 1, 1)
+ let regt = getregtype('v')
+ normal! gv"vy
+ let expr = @v
+ call setpos('.', pos)
+ call setreg('v', reg, regt)
+ else
+ let expr = expand('<cexpr>')
+ endif
+ call term_sendkeys(s:commbuf, '-data-evaluate-expression "' . expr . "\"\r")
+ let s:evalexpr = expr
+endfunc
+
+" Handle the result of data-evaluate-expression
+func s:HandleEvaluate(msg)
+ echomsg '"' . s:evalexpr . '": ' . substitute(a:msg, '.*value="\(.*\)"', '\1', '')
+endfunc
+
+" Handle an error.
+func s:HandleError(msg)
+ echoerr substitute(a:msg, '.*msg="\(.*\)"', '\1', '')
+endfunc
+
" Handle stopping and running message from gdb.
" Will update the sign that shows the current position.
func s:HandleCursor(msg)