Mercurial > vim
changeset 33944:4cacac1abdb8
runtime(termdebug): add Tbreak command
Commit: https://github.com/vim/vim/commit/323dda1484d95ee5c8a1b2205f8c495446df75ee
Author: iam28th <artyom28th@gmail.com>
Date: Thu Dec 14 20:30:26 2023 +0100
runtime(termdebug): add Tbreak command
closes: https://github.com/vim/vim/issues/13656
Signed-off-by: iam28th <artyom28th@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 14 Dec 2023 20:45:03 +0100 |
parents | 2b5dfa987093 |
children | 27746ed6cb05 |
files | runtime/doc/tags runtime/doc/terminal.txt runtime/pack/dist/opt/termdebug/plugin/termdebug.vim src/testdir/test_termdebug.vim |
diffstat | 4 files changed, 95 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -2159,6 +2159,7 @@ 90.5 usr_90.txt /*90.5* :Stop terminal.txt /*:Stop* :TOhtml syntax.txt /*:TOhtml* :TarDiff pi_tar.txt /*:TarDiff* +:Tbreak terminal.txt /*:Tbreak* :Termdebug terminal.txt /*:Termdebug* :TermdebugCommand terminal.txt /*:TermdebugCommand* :Texplore pi_netrw.txt /*:Texplore*
--- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -1331,6 +1331,9 @@ gdb: *:Break* set a breakpoint at the cursor position :Break {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 *:Step* execute the gdb "step" command
--- a/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim +++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim @@ -953,6 +953,7 @@ func s:InstallCommands() set cpo&vim command -nargs=? Break call s:SetBreakpoint(<q-args>) + command -nargs=? Tbreak call s:SetBreakpoint(<q-args>, v:true) command Clear call s:ClearBreakpoint() command Step call s:SendResumingCommand('-exec-step') command Over call s:SendResumingCommand('-exec-next') @@ -1067,6 +1068,7 @@ endfunc " Delete installed debugger commands in the current window. func s:DeleteCommands() delcommand Break + delcommand Tbreak delcommand Clear delcommand Step delcommand Over @@ -1167,7 +1169,7 @@ func s:Until(at) endfunc " :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. " Interrupt to make it work. let do_continue = 0 @@ -1180,7 +1182,12 @@ func s:SetBreakpoint(at) " Use the fname:lnum format, older gdb can't handle --source. let at = empty(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 Continue endif
--- a/src/testdir/test_termdebug.vim +++ b/src/testdir/test_termdebug.vim @@ -18,9 +18,8 @@ if g:GCC->empty() throw 'Skipped: gcc is not found in $PATH' endif -packadd termdebug - -func Test_termdebug_basic() +function s:generate_files(bin_name) + let src_name = a:bin_name .. '.c' let lines =<< trim END #include <stdio.h> #include <stdlib.h> @@ -46,8 +45,21 @@ func Test_termdebug_basic() return 0; } END - call writefile(lines, 'XTD_basic.c', 'D') - call system($'{g:GCC} -g -o XTD_basic XTD_basic.c') + call writefile(lines, src_name) + 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 Termdebug ./XTD_basic @@ -148,7 +160,71 @@ func Test_termdebug_basic() call WaitForAssert({-> assert_equal(1, winnr('$'))}) 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! endfunc