forked from aniani/vim
runtime(termdebug): add Tbreak command
closes: #13656 Signed-off-by: iam28th <artyom28th@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
74da0ee0a2
commit
323dda1484
@@ -2159,6 +2159,7 @@ $quote eval.txt /*$quote*
|
|||||||
:Stop terminal.txt /*:Stop*
|
:Stop terminal.txt /*:Stop*
|
||||||
:TOhtml syntax.txt /*:TOhtml*
|
:TOhtml syntax.txt /*:TOhtml*
|
||||||
:TarDiff pi_tar.txt /*:TarDiff*
|
:TarDiff pi_tar.txt /*:TarDiff*
|
||||||
|
:Tbreak terminal.txt /*:Tbreak*
|
||||||
:Termdebug terminal.txt /*:Termdebug*
|
:Termdebug terminal.txt /*:Termdebug*
|
||||||
:TermdebugCommand terminal.txt /*:TermdebugCommand*
|
:TermdebugCommand terminal.txt /*:TermdebugCommand*
|
||||||
:Texplore pi_netrw.txt /*:Texplore*
|
:Texplore pi_netrw.txt /*:Texplore*
|
||||||
|
@@ -1331,6 +1331,9 @@ gdb:
|
|||||||
*:Break* set a breakpoint at the cursor position
|
*:Break* set a breakpoint at the cursor position
|
||||||
:Break {position}
|
:Break {position}
|
||||||
set a breakpoint at the specified position
|
set a breakpoint at the specified position
|
||||||
|
*:Tbreak* set a temporary breakpoint at the cursor position
|
||||||
|
:Tbreak {position}
|
||||||
|
set a temporary breakpoint at the specified position
|
||||||
*:Clear* delete the breakpoint at the cursor position
|
*:Clear* delete the breakpoint at the cursor position
|
||||||
|
|
||||||
*:Step* execute the gdb "step" command
|
*:Step* execute the gdb "step" command
|
||||||
|
@@ -953,6 +953,7 @@ func s:InstallCommands()
|
|||||||
set cpo&vim
|
set cpo&vim
|
||||||
|
|
||||||
command -nargs=? Break call s:SetBreakpoint(<q-args>)
|
command -nargs=? Break call s:SetBreakpoint(<q-args>)
|
||||||
|
command -nargs=? Tbreak call s:SetBreakpoint(<q-args>, v:true)
|
||||||
command Clear call s:ClearBreakpoint()
|
command Clear call s:ClearBreakpoint()
|
||||||
command Step call s:SendResumingCommand('-exec-step')
|
command Step call s:SendResumingCommand('-exec-step')
|
||||||
command Over call s:SendResumingCommand('-exec-next')
|
command Over call s:SendResumingCommand('-exec-next')
|
||||||
@@ -1067,6 +1068,7 @@ endfunc
|
|||||||
" Delete installed debugger commands in the current window.
|
" Delete installed debugger commands in the current window.
|
||||||
func s:DeleteCommands()
|
func s:DeleteCommands()
|
||||||
delcommand Break
|
delcommand Break
|
||||||
|
delcommand Tbreak
|
||||||
delcommand Clear
|
delcommand Clear
|
||||||
delcommand Step
|
delcommand Step
|
||||||
delcommand Over
|
delcommand Over
|
||||||
@@ -1167,7 +1169,7 @@ func s:Until(at)
|
|||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" :Break - Set a breakpoint at the cursor position.
|
" :Break - Set a breakpoint at the cursor position.
|
||||||
func s:SetBreakpoint(at)
|
func s:SetBreakpoint(at, tbreak=v:false)
|
||||||
" Setting a breakpoint may not work while the program is running.
|
" Setting a breakpoint may not work while the program is running.
|
||||||
" Interrupt to make it work.
|
" Interrupt to make it work.
|
||||||
let do_continue = 0
|
let do_continue = 0
|
||||||
@@ -1180,7 +1182,12 @@ func s:SetBreakpoint(at)
|
|||||||
" Use the fname:lnum format, older gdb can't handle --source.
|
" Use the fname:lnum format, older gdb can't handle --source.
|
||||||
let at = empty(a:at) ?
|
let at = empty(a:at) ?
|
||||||
\ fnameescape(expand('%:p')) . ':' . line('.') : a:at
|
\ fnameescape(expand('%:p')) . ':' . line('.') : a:at
|
||||||
call s:SendCommand('-break-insert ' . at)
|
if a:tbreak
|
||||||
|
let cmd = '-break-insert -t ' . at
|
||||||
|
else
|
||||||
|
let cmd = '-break-insert ' . at
|
||||||
|
endif
|
||||||
|
call s:SendCommand(cmd)
|
||||||
if do_continue
|
if do_continue
|
||||||
Continue
|
Continue
|
||||||
endif
|
endif
|
||||||
|
@@ -18,9 +18,8 @@ if g:GCC->empty()
|
|||||||
throw 'Skipped: gcc is not found in $PATH'
|
throw 'Skipped: gcc is not found in $PATH'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
packadd termdebug
|
function s:generate_files(bin_name)
|
||||||
|
let src_name = a:bin_name .. '.c'
|
||||||
func Test_termdebug_basic()
|
|
||||||
let lines =<< trim END
|
let lines =<< trim END
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -46,8 +45,21 @@ func Test_termdebug_basic()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
END
|
END
|
||||||
call writefile(lines, 'XTD_basic.c', 'D')
|
call writefile(lines, src_name)
|
||||||
call system($'{g:GCC} -g -o XTD_basic XTD_basic.c')
|
call system($'{g:GCC} -g -o {a:bin_name} {src_name}')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function s:cleanup_files(bin_name)
|
||||||
|
call delete(a:bin_name)
|
||||||
|
call delete(a:bin_name .. '.c')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
packadd termdebug
|
||||||
|
|
||||||
|
func Test_termdebug_basic()
|
||||||
|
let bin_name = 'XTD_basic'
|
||||||
|
let src_name = bin_name .. '.c'
|
||||||
|
call s:generate_files(bin_name)
|
||||||
|
|
||||||
edit XTD_basic.c
|
edit XTD_basic.c
|
||||||
Termdebug ./XTD_basic
|
Termdebug ./XTD_basic
|
||||||
@@ -148,7 +160,71 @@ func Test_termdebug_basic()
|
|||||||
call WaitForAssert({-> assert_equal(1, winnr('$'))})
|
call WaitForAssert({-> assert_equal(1, winnr('$'))})
|
||||||
call assert_equal([], sign_getplaced('', #{group: 'TermDebug'})[0].signs)
|
call assert_equal([], sign_getplaced('', #{group: 'TermDebug'})[0].signs)
|
||||||
|
|
||||||
call delete('XTD_basic')
|
call s:cleanup_files(bin_name)
|
||||||
|
%bw!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_termdebug_tbreak()
|
||||||
|
let g:test_is_flaky = 1
|
||||||
|
let bin_name = 'XTD_tbreak'
|
||||||
|
let src_name = bin_name .. '.c'
|
||||||
|
|
||||||
|
eval s:generate_files(bin_name)
|
||||||
|
|
||||||
|
execute 'edit ' .. src_name
|
||||||
|
execute 'Termdebug ./' .. bin_name
|
||||||
|
|
||||||
|
call WaitForAssert({-> assert_equal(3, winnr('$'))})
|
||||||
|
let gdb_buf = winbufnr(1)
|
||||||
|
wincmd b
|
||||||
|
|
||||||
|
let bp_line = 22 " 'return' statement in main
|
||||||
|
let temp_bp_line = 10 " 'if' statement in 'for' loop body
|
||||||
|
execute "Tbreak " .. temp_bp_line
|
||||||
|
execute "Break " .. bp_line
|
||||||
|
|
||||||
|
call term_wait(gdb_buf)
|
||||||
|
redraw!
|
||||||
|
" both temporary and normal breakpoint signs were displayed...
|
||||||
|
call assert_equal([
|
||||||
|
\ {'lnum': temp_bp_line, 'id': 1014, 'name': 'debugBreakpoint1.0',
|
||||||
|
\ 'priority': 110, 'group': 'TermDebug'},
|
||||||
|
\ {'lnum': bp_line, 'id': 2014, 'name': 'debugBreakpoint2.0',
|
||||||
|
\ 'priority': 110, 'group': 'TermDebug'}],
|
||||||
|
\ sign_getplaced('', #{group: 'TermDebug'})[0].signs)
|
||||||
|
|
||||||
|
Run
|
||||||
|
call term_wait(gdb_buf, 400)
|
||||||
|
redraw!
|
||||||
|
" debugPC sign is on the line where the temp. bp was set;
|
||||||
|
" temp. bp sign was removed after hit;
|
||||||
|
" normal bp sign is still present
|
||||||
|
call WaitForAssert({-> assert_equal([
|
||||||
|
\ {'lnum': temp_bp_line, 'id': 12, 'name': 'debugPC', 'priority': 110,
|
||||||
|
\ 'group': 'TermDebug'},
|
||||||
|
\ {'lnum': bp_line, 'id': 2014, 'name': 'debugBreakpoint2.0',
|
||||||
|
\ 'priority': 110, 'group': 'TermDebug'}],
|
||||||
|
\ sign_getplaced('', #{group: 'TermDebug'})[0].signs)})
|
||||||
|
|
||||||
|
Continue
|
||||||
|
call term_wait(gdb_buf)
|
||||||
|
redraw!
|
||||||
|
" debugPC is on the normal breakpoint,
|
||||||
|
" temp. bp on line 10 was only hit once
|
||||||
|
call WaitForAssert({-> assert_equal([
|
||||||
|
\ {'lnum': bp_line, 'id': 12, 'name': 'debugPC', 'priority': 110,
|
||||||
|
\ 'group': 'TermDebug'},
|
||||||
|
\ {'lnum': bp_line, 'id': 2014, 'name': 'debugBreakpoint2.0',
|
||||||
|
\ 'priority': 110, 'group': 'TermDebug'}],
|
||||||
|
\ sign_getplaced('', #{group: 'TermDebug'})[0].signs)})
|
||||||
|
|
||||||
|
wincmd t
|
||||||
|
quit!
|
||||||
|
redraw!
|
||||||
|
call WaitForAssert({-> assert_equal(1, winnr('$'))})
|
||||||
|
call assert_equal([], sign_getplaced('', #{group: 'TermDebug'})[0].signs)
|
||||||
|
|
||||||
|
eval s:cleanup_files(bin_name)
|
||||||
%bw!
|
%bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user