From 60e73f2acc890f07056fa1bea8dbe89d26918b3e Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 12 Nov 2017 18:02:06 +0100 Subject: patch 8.0.1293: setting a breakpoint in the terminal debugger sometimes fails Problem: Setting a breakpoint in the terminal debugger sometimes fails. Solution: Interrupt the program if needed. Set the interface to async. --- runtime/doc/terminal.txt | 62 ++++++++++++---------- .../pack/dist/opt/termdebug/plugin/termdebug.vim | 53 +++++++++++++++--- src/version.c | 2 + 3 files changed, 83 insertions(+), 34 deletions(-) diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt index 54899fca0f..b3df8ce046 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 Nov 09 +*terminal.txt* For Vim version 8.0. Last change: 2017 Nov 12 VIM REFERENCE MANUAL by Bram Moolenaar @@ -60,7 +60,7 @@ the job. This uses a pty when possible. You can click outside of the terminal window to move keyboard focus elsewhere. CTRL-W can be used to navigate between windows and other CTRL-W commands, e.g.: - CTRL-W CTRL-W move focus to the next window + CTRL-W CTRL-W move focus to the next window CTRL-W : enter an Ex command See |CTRL-W| for more commands. @@ -80,7 +80,7 @@ the job. For example: 'termkey' : enter an Ex command 'termkey' 'termkey' send 'termkey' to the job in the terminal 'termkey' . send a CTRL-W to the job in the terminal - 'termkey' N go to terminal Normal mode, see below + 'termkey' N go to terminal Normal mode, see below 'termkey' CTRL-N same as CTRL-W N 'termkey' CTRL-C same as |t_CTRL-W_CTRL-C| *t_CTRL-\_CTRL-N* @@ -286,10 +286,10 @@ both Vim and xterm recognize will be available in the terminal window. If you want to pass on other escape sequences to the job running in the terminal you need to set up forwarding. Example: > tmap ]b SendToTerm("\]b") - func SendToTerm(what) - call term_sendkeys('', a:what) - return '' - endfunc + func SendToTerm(what) + call term_sendkeys('', a:what) + return '' + endfunc Unix ~ @@ -447,29 +447,35 @@ a deeper level. Stepping through code ~ *termdebug-stepping* Put focus on the gdb window to type commands there. Some common ones are: -- CTRL-C interrupt the program -- next execute the current line and stop at the next line -- step execute the current line and stop at the next statement, entering - functions -- finish execute until leaving the current function -- where show the stack -- frame N go to the Nth stack frame -- continue continue execution - -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 +- CTRL-C interrupt the program +- next execute the current line and stop at the next line +- step execute the current line and stop at the next statement, + entering functions +- finish execute until leaving the current function +- where show the stack +- frame N go to the Nth stack frame +- continue continue execution + +In the window showing the source code these commands can used to control gdb: + :Run [args] run the program with [args] or the previous arguments + :Arguments {args} set arguments for the next :Run + + :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 + :Stop interrupt the program The plugin adds a window toolbar with these entries: - Step :Step - Next :Over - Finish :Finish - Cont :Continue - Eval :Evaluate + Step :Step + Next :Over + Finish :Finish + Cont :Continue + Stop :Stop + Eval :Evaluate This way you can use the mouse to perform the most common commands. diff --git a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim index 5704c4680b..635bf93f23 100644 --- a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim +++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim @@ -20,6 +20,9 @@ if exists(':Termdebug') finish endif +" Uncomment this line to write logging in "debuglog". +" call ch_logfile('debuglog', 'w') + " The command that starts debugging, e.g. ":Termdebug vim". " To end type "quit" in the gdb window. command -nargs=* -complete=file Termdebug call s:StartDebug() @@ -31,6 +34,7 @@ endif let s:pc_id = 12 let s:break_id = 13 +let s:stopped = 1 if &background == 'light' hi default debugPC term=reverse ctermbg=lightblue guibg=lightblue @@ -83,11 +87,11 @@ func s:StartDebug(cmd) " Add -quiet to avoid the intro message causing a hit-enter prompt. let cmd = [g:termdebugger, '-quiet', '-tty', pty, a:cmd] echomsg 'executing "' . join(cmd) . '"' - let gdbbuf = term_start(cmd, { + let s:gdbbuf = term_start(cmd, { \ 'exit_cb': function('s:EndDebug'), \ 'term_finish': 'close', \ }) - if gdbbuf == 0 + if s:gdbbuf == 0 echoerr 'Failed to open the gdb terminal window' exe 'bwipe! ' . s:ptybuf exe 'bwipe! ' . s:commbuf @@ -97,7 +101,12 @@ func s:StartDebug(cmd) " Connect gdb to the communication pty, using the GDB/MI interface " If you get an error "undefined command" your GDB is too old. - call term_sendkeys(gdbbuf, 'new-ui mi ' . commpty . "\r") + call term_sendkeys(s:gdbbuf, 'new-ui mi ' . commpty . "\r") + + " Interpret commands while the target is running. This should usualy only be + " exec-interrupt, since many commands don't work properly while the target is + " running. + call s:SendCommand('-gdb-set mi-async on') " Sign used to highlight the line where the program has stopped. " There can be only one. @@ -170,6 +179,9 @@ func s:InstallCommands() command Step call s:SendCommand('-exec-step') command Over call s:SendCommand('-exec-next') command Finish call s:SendCommand('-exec-finish') + command -nargs=* Run call s:Run() + command -nargs=* Arguments call s:SendCommand('-exec-arguments ' . ) + command Stop call s:SendCommand('-exec-interrupt') command Continue call s:SendCommand('-exec-continue') command -range -nargs=* Evaluate call s:Evaluate(, ) command Gdb call win_gotoid(s:gdbwin) @@ -183,6 +195,7 @@ func s:InstallCommands() nnoremenu WinBar.Next :Over nnoremenu WinBar.Finish :Finish nnoremenu WinBar.Cont :Continue + nnoremenu WinBar.Stop :Stop nnoremenu WinBar.Eval :Evaluate endif endfunc @@ -194,6 +207,9 @@ func s:DeleteCommands() delcommand Step delcommand Over delcommand Finish + delcommand Run + delcommand Arguments + delcommand Stop delcommand Continue delcommand Evaluate delcommand Gdb @@ -206,6 +222,7 @@ func s:DeleteCommands() aunmenu WinBar.Next aunmenu WinBar.Finish aunmenu WinBar.Cont + aunmenu WinBar.Stop aunmenu WinBar.Eval endif @@ -220,8 +237,19 @@ endfunc " :Break - Set a breakpoint at the cursor position. func s:SetBreakpoint() - call term_sendkeys(s:commbuf, '-break-insert --source ' - \ . fnameescape(expand('%:p')) . ' --line ' . line('.') . "\r") + " Setting a breakpoint may not work while the program is running. + " Interrupt to make it work. + let do_continue = 0 + if !s:stopped + let do_continue = 1 + call s:SendCommand('-exec-interrupt') + sleep 10m + endif + call s:SendCommand('-break-insert --source ' + \ . fnameescape(expand('%:p')) . ' --line ' . line('.')) + if do_continue + call s:SendCommand('-exec-continue') + endif endfunc " :Delete - Delete a breakpoint at the cursor position. @@ -244,6 +272,13 @@ func s:SendCommand(cmd) call term_sendkeys(s:commbuf, a:cmd . "\r") endfunc +func s:Run(args) + if a:args != '' + call s:SendCommand('-exec-arguments ' . a:args) + endif + call s:SendCommand('-exec-run') +endfunc + " :Evaluate - evaluate what is under the cursor func s:Evaluate(range, arg) if a:arg != '' @@ -259,7 +294,7 @@ func s:Evaluate(range, arg) else let expr = expand('') endif - call term_sendkeys(s:commbuf, '-data-evaluate-expression "' . expr . "\"\r") + call s:SendCommand('-data-evaluate-expression "' . expr . '"') let s:evalexpr = expr endfunc @@ -286,6 +321,12 @@ endfunc func s:HandleCursor(msg) let wid = win_getid(winnr()) + if a:msg =~ '^\*stopped' + let s:stopped = 1 + elseif a:msg =~ '^\*running' + let s:stopped = 0 + endif + if win_gotoid(s:startwin) let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '') if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname) diff --git a/src/version.c b/src/version.c index f63b18685c..871a0e9bfd 100644 --- a/src/version.c +++ b/src/version.c @@ -761,6 +761,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1293, /**/ 1292, /**/ -- cgit v1.2.3