0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.0.1092: terminal debugger can't evaluate expressions

Problem:    Terminal debugger can't evaluate expressions.
Solution:   Add :Evaluate and K.  Various other improvements.
This commit is contained in:
Bram Moolenaar
2017-09-10 19:14:31 +02:00
parent 95c83c64be
commit 45d5f26d11
3 changed files with 93 additions and 22 deletions

View File

@@ -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 VIM REFERENCE MANUAL by Bram Moolenaar
@@ -318,11 +318,12 @@ To start debugging use `:TermDebug` folowed by the command name, for example: >
:TermDebug vim :TermDebug vim
This opens two windows: This opens two windows:
- A terminal window in which "gdb vim" is executed. Here you can directly gdb window A terminal window in which "gdb vim" is executed. Here you
interact with gdb. The buffer name is "!gdb". 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 window A terminal window for the executed program. When "run" is
program I/O will happen in this window, so that it does not interfere with used in gdb the program I/O will happen in this window, so
controlling gdb. The buffer name is "gdb program". 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 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 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 Focus the terminal of the executed program to interact with it. This works
the same as any command running in a terminal window. 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 ~ 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 - frame N go to the Nth stack frame
- continue continue execution - continue continue execution
In the window showing the source code some commands can passed to gdb: 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 :Break set a breakpoint at the current line; a sign will be displayed
- Delete delete a breakpoint at the current line :Delete delete a breakpoint at the current line
- Step execute the gdb "step" command :Step execute the gdb "step" command
- NNext execute the gdb "next" command (:Next is a Vim command) :Over execute the gdb "next" command (:Next is a Vim command)
- Finish execute the gdb "finish" command :Finish execute the gdb "finish" command
- Continue execute the gdb "continue" 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 ~ Communication ~
@@ -386,9 +404,5 @@ When 'background' is "dark":
hi debugBreakpoint term=reverse ctermbg=red guibg=red 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: vim:tw=78:ts=8:ft=help:norl:

View File

@@ -54,6 +54,7 @@ func s:StartDebug(cmd)
return return
endif endif
let pty = job_info(term_getjob(s:ptybuf))['tty_out'] 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 " Create a hidden terminal window to communicate with gdb
let s:commbuf = term_start('NONE', { let s:commbuf = term_start('NONE', {
@@ -81,12 +82,15 @@ func s:StartDebug(cmd)
exe 'bwipe! ' . s:commbuf exe 'bwipe! ' . s:commbuf
return return
endif endif
let s:gdbwin = win_getid(winnr())
" Connect gdb to the communication pty, using the GDB/MI interface " Connect gdb to the communication pty, using the GDB/MI interface
call term_sendkeys(gdbbuf, 'new-ui mi ' . commpty . "\r") 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 s:InstallCommands()
call win_gotoid(s:gdbwin)
let s:breakpoints = {} let s:breakpoints = {}
endfunc endfunc
@@ -116,10 +120,14 @@ func s:CommOutput(chan, msg)
if msg != '' if msg != ''
if msg =~ '^\*\(stopped\|running\)' if msg =~ '^\*\(stopped\|running\)'
call s:HandleCursor(msg) call s:HandleCursor(msg)
elseif msg =~ '^\^done,bkpt=' elseif msg =~ '^\^done,bkpt=' || msg =~ '^=breakpoint-created,'
call s:HandleNewBreakpoint(msg) call s:HandleNewBreakpoint(msg)
elseif msg =~ '^=breakpoint-deleted,' elseif msg =~ '^=breakpoint-deleted,'
call s:HandleBreakpointDelete(msg) call s:HandleBreakpointDelete(msg)
elseif msg =~ '^\^done,value='
call s:HandleEvaluate(msg)
elseif msg =~ '^\^error,msg='
call s:HandleError(msg)
endif endif
endif endif
endfor endfor
@@ -130,9 +138,15 @@ func s:InstallCommands()
command Break call s:SetBreakpoint() command Break call s:SetBreakpoint()
command Delete call s:DeleteBreakpoint() command Delete call s:DeleteBreakpoint()
command Step call s:SendCommand('-exec-step') 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 Finish call s:SendCommand('-exec-finish')
command Continue call s:SendCommand('-exec-continue') 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 endfunc
" Delete installed debugger commands in the current window. " Delete installed debugger commands in the current window.
@@ -140,9 +154,21 @@ func s:DeleteCommands()
delcommand Break delcommand Break
delcommand Delete delcommand Delete
delcommand Step delcommand Step
delcommand NNext delcommand Over
delcommand Finish delcommand Finish
delcommand Continue 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 endfunc
" :Break - Set a breakpoint at the cursor position. " :Break - Set a breakpoint at the cursor position.
@@ -171,6 +197,35 @@ func s:SendCommand(cmd)
call term_sendkeys(s:commbuf, a:cmd . "\r") call term_sendkeys(s:commbuf, a:cmd . "\r")
endfunc 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. " Handle stopping and running message from gdb.
" Will update the sign that shows the current position. " Will update the sign that shows the current position.
func s:HandleCursor(msg) func s:HandleCursor(msg)

View File

@@ -769,6 +769,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1092,
/**/ /**/
1091, 1091,
/**/ /**/