mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
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.
This commit is contained in:
parent
d327b0c68f
commit
60e73f2acc
@ -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
|
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.
|
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 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
|
CTRL-W : enter an Ex command
|
||||||
See |CTRL-W| for more commands.
|
See |CTRL-W| for more commands.
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ the job. For example:
|
|||||||
'termkey' : enter an Ex command
|
'termkey' : enter an Ex command
|
||||||
'termkey' 'termkey' send 'termkey' to the job in the terminal
|
'termkey' 'termkey' send 'termkey' to the job in the terminal
|
||||||
'termkey' . send a CTRL-W 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-N same as CTRL-W N
|
||||||
'termkey' CTRL-C same as |t_CTRL-W_CTRL-C|
|
'termkey' CTRL-C same as |t_CTRL-W_CTRL-C|
|
||||||
*t_CTRL-\_CTRL-N*
|
*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
|
want to pass on other escape sequences to the job running in the terminal you
|
||||||
need to set up forwarding. Example: >
|
need to set up forwarding. Example: >
|
||||||
tmap <expr> <Esc>]b SendToTerm("\<Esc>]b")
|
tmap <expr> <Esc>]b SendToTerm("\<Esc>]b")
|
||||||
func SendToTerm(what)
|
func SendToTerm(what)
|
||||||
call term_sendkeys('', a:what)
|
call term_sendkeys('', a:what)
|
||||||
return ''
|
return ''
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
Unix ~
|
Unix ~
|
||||||
@ -447,29 +447,35 @@ a deeper level.
|
|||||||
Stepping through code ~
|
Stepping through code ~
|
||||||
*termdebug-stepping*
|
*termdebug-stepping*
|
||||||
Put focus on the gdb window to type commands there. Some common ones are:
|
Put focus on the gdb window to type commands there. Some common ones are:
|
||||||
- CTRL-C interrupt the program
|
- CTRL-C interrupt the program
|
||||||
- next execute the current line and stop at the next line
|
- next execute the current line and stop at the next line
|
||||||
- step execute the current line and stop at the next statement, entering
|
- step execute the current line and stop at the next statement,
|
||||||
functions
|
entering functions
|
||||||
- finish execute until leaving the current function
|
- finish execute until leaving the current function
|
||||||
- where show the stack
|
- where show the stack
|
||||||
- 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 used to control gdb:
|
In the window showing the source code these commands can used to control gdb:
|
||||||
:Break set a breakpoint at the current line; a sign will be displayed
|
:Run [args] run the program with [args] or the previous arguments
|
||||||
:Delete delete a breakpoint at the current line
|
:Arguments {args} set arguments for the next :Run
|
||||||
:Step execute the gdb "step" command
|
|
||||||
:Over execute the gdb "next" command (:Next is a Vim command)
|
:Break set a breakpoint at the current line; a sign will be displayed
|
||||||
:Finish execute the gdb "finish" command
|
:Delete delete a breakpoint at the current line
|
||||||
:Continue execute the gdb "continue" command
|
|
||||||
|
: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:
|
The plugin adds a window toolbar with these entries:
|
||||||
Step :Step
|
Step :Step
|
||||||
Next :Over
|
Next :Over
|
||||||
Finish :Finish
|
Finish :Finish
|
||||||
Cont :Continue
|
Cont :Continue
|
||||||
Eval :Evaluate
|
Stop :Stop
|
||||||
|
Eval :Evaluate
|
||||||
This way you can use the mouse to perform the most common commands.
|
This way you can use the mouse to perform the most common commands.
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,6 +20,9 @@ if exists(':Termdebug')
|
|||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" Uncomment this line to write logging in "debuglog".
|
||||||
|
" call ch_logfile('debuglog', 'w')
|
||||||
|
|
||||||
" The command that starts debugging, e.g. ":Termdebug vim".
|
" The command that starts debugging, e.g. ":Termdebug vim".
|
||||||
" To end type "quit" in the gdb window.
|
" To end type "quit" in the gdb window.
|
||||||
command -nargs=* -complete=file Termdebug call s:StartDebug(<q-args>)
|
command -nargs=* -complete=file Termdebug call s:StartDebug(<q-args>)
|
||||||
@ -31,6 +34,7 @@ endif
|
|||||||
|
|
||||||
let s:pc_id = 12
|
let s:pc_id = 12
|
||||||
let s:break_id = 13
|
let s:break_id = 13
|
||||||
|
let s:stopped = 1
|
||||||
|
|
||||||
if &background == 'light'
|
if &background == 'light'
|
||||||
hi default debugPC term=reverse ctermbg=lightblue guibg=lightblue
|
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.
|
" Add -quiet to avoid the intro message causing a hit-enter prompt.
|
||||||
let cmd = [g:termdebugger, '-quiet', '-tty', pty, a:cmd]
|
let cmd = [g:termdebugger, '-quiet', '-tty', pty, a:cmd]
|
||||||
echomsg 'executing "' . join(cmd) . '"'
|
echomsg 'executing "' . join(cmd) . '"'
|
||||||
let gdbbuf = term_start(cmd, {
|
let s:gdbbuf = term_start(cmd, {
|
||||||
\ 'exit_cb': function('s:EndDebug'),
|
\ 'exit_cb': function('s:EndDebug'),
|
||||||
\ 'term_finish': 'close',
|
\ 'term_finish': 'close',
|
||||||
\ })
|
\ })
|
||||||
if gdbbuf == 0
|
if s:gdbbuf == 0
|
||||||
echoerr 'Failed to open the gdb terminal window'
|
echoerr 'Failed to open the gdb terminal window'
|
||||||
exe 'bwipe! ' . s:ptybuf
|
exe 'bwipe! ' . s:ptybuf
|
||||||
exe 'bwipe! ' . s:commbuf
|
exe 'bwipe! ' . s:commbuf
|
||||||
@ -97,7 +101,12 @@ func s:StartDebug(cmd)
|
|||||||
|
|
||||||
" Connect gdb to the communication pty, using the GDB/MI interface
|
" Connect gdb to the communication pty, using the GDB/MI interface
|
||||||
" If you get an error "undefined command" your GDB is too old.
|
" 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.
|
" Sign used to highlight the line where the program has stopped.
|
||||||
" There can be only one.
|
" There can be only one.
|
||||||
@ -170,6 +179,9 @@ func s:InstallCommands()
|
|||||||
command Step call s:SendCommand('-exec-step')
|
command Step call s:SendCommand('-exec-step')
|
||||||
command Over 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 -nargs=* Run call s:Run(<q-args>)
|
||||||
|
command -nargs=* Arguments call s:SendCommand('-exec-arguments ' . <q-args>)
|
||||||
|
command Stop call s:SendCommand('-exec-interrupt')
|
||||||
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 -range -nargs=* Evaluate call s:Evaluate(<range>, <q-args>)
|
||||||
command Gdb call win_gotoid(s:gdbwin)
|
command Gdb call win_gotoid(s:gdbwin)
|
||||||
@ -183,6 +195,7 @@ func s:InstallCommands()
|
|||||||
nnoremenu WinBar.Next :Over<CR>
|
nnoremenu WinBar.Next :Over<CR>
|
||||||
nnoremenu WinBar.Finish :Finish<CR>
|
nnoremenu WinBar.Finish :Finish<CR>
|
||||||
nnoremenu WinBar.Cont :Continue<CR>
|
nnoremenu WinBar.Cont :Continue<CR>
|
||||||
|
nnoremenu WinBar.Stop :Stop<CR>
|
||||||
nnoremenu WinBar.Eval :Evaluate<CR>
|
nnoremenu WinBar.Eval :Evaluate<CR>
|
||||||
endif
|
endif
|
||||||
endfunc
|
endfunc
|
||||||
@ -194,6 +207,9 @@ func s:DeleteCommands()
|
|||||||
delcommand Step
|
delcommand Step
|
||||||
delcommand Over
|
delcommand Over
|
||||||
delcommand Finish
|
delcommand Finish
|
||||||
|
delcommand Run
|
||||||
|
delcommand Arguments
|
||||||
|
delcommand Stop
|
||||||
delcommand Continue
|
delcommand Continue
|
||||||
delcommand Evaluate
|
delcommand Evaluate
|
||||||
delcommand Gdb
|
delcommand Gdb
|
||||||
@ -206,6 +222,7 @@ func s:DeleteCommands()
|
|||||||
aunmenu WinBar.Next
|
aunmenu WinBar.Next
|
||||||
aunmenu WinBar.Finish
|
aunmenu WinBar.Finish
|
||||||
aunmenu WinBar.Cont
|
aunmenu WinBar.Cont
|
||||||
|
aunmenu WinBar.Stop
|
||||||
aunmenu WinBar.Eval
|
aunmenu WinBar.Eval
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -220,8 +237,19 @@ endfunc
|
|||||||
|
|
||||||
" :Break - Set a breakpoint at the cursor position.
|
" :Break - Set a breakpoint at the cursor position.
|
||||||
func s:SetBreakpoint()
|
func s:SetBreakpoint()
|
||||||
call term_sendkeys(s:commbuf, '-break-insert --source '
|
" Setting a breakpoint may not work while the program is running.
|
||||||
\ . fnameescape(expand('%:p')) . ' --line ' . line('.') . "\r")
|
" 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
|
endfunc
|
||||||
|
|
||||||
" :Delete - Delete a breakpoint at the cursor position.
|
" :Delete - Delete a breakpoint at the cursor position.
|
||||||
@ -244,6 +272,13 @@ func s:SendCommand(cmd)
|
|||||||
call term_sendkeys(s:commbuf, a:cmd . "\r")
|
call term_sendkeys(s:commbuf, a:cmd . "\r")
|
||||||
endfunc
|
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
|
" :Evaluate - evaluate what is under the cursor
|
||||||
func s:Evaluate(range, arg)
|
func s:Evaluate(range, arg)
|
||||||
if a:arg != ''
|
if a:arg != ''
|
||||||
@ -259,7 +294,7 @@ func s:Evaluate(range, arg)
|
|||||||
else
|
else
|
||||||
let expr = expand('<cexpr>')
|
let expr = expand('<cexpr>')
|
||||||
endif
|
endif
|
||||||
call term_sendkeys(s:commbuf, '-data-evaluate-expression "' . expr . "\"\r")
|
call s:SendCommand('-data-evaluate-expression "' . expr . '"')
|
||||||
let s:evalexpr = expr
|
let s:evalexpr = expr
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@ -286,6 +321,12 @@ endfunc
|
|||||||
func s:HandleCursor(msg)
|
func s:HandleCursor(msg)
|
||||||
let wid = win_getid(winnr())
|
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)
|
if win_gotoid(s:startwin)
|
||||||
let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
|
let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
|
||||||
if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
|
if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
|
||||||
|
@ -761,6 +761,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 */
|
||||||
|
/**/
|
||||||
|
1293,
|
||||||
/**/
|
/**/
|
||||||
1292,
|
1292,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user