# HG changeset patch # User Christian Brabandt # Date 1510506904 -3600 # Node ID db9ffed7e1fc09ee0266beda34a94def6a8c6c06 # Parent 3b4c04beb9133f6b901977b7fa40c041f690c577 patch 8.0.1293: setting a breakpoint in the terminal debugger sometimes fails commit https://github.com/vim/vim/commit/60e73f2acc890f07056fa1bea8dbe89d26918b3e Author: Bram Moolenaar Date: Sun Nov 12 18:02:06 2017 +0100 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. diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt --- 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. 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 ava 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 +- 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 +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 --- 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 --- 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 */ /**/ + 1293, +/**/ 1292, /**/ 1291,