]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
runtime(termdebug): add Tbreak command
authoriam28th <artyom28th@gmail.com>
Thu, 14 Dec 2023 19:30:26 +0000 (20:30 +0100)
committerChristian Brabandt <cb@256bit.org>
Thu, 14 Dec 2023 19:33:43 +0000 (20:33 +0100)
closes: #13656

Signed-off-by: iam28th <artyom28th@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/doc/tags
runtime/doc/terminal.txt
runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
src/testdir/test_termdebug.vim

index fdda06b7e1ea42416fca62ecbbdca9f217f2e1d6..964789c316eb255b07d2d0837b48e0ea72bc64a5 100644 (file)
@@ -2159,6 +2159,7 @@ $quote    eval.txt        /*$quote*
 :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*
index 3869bcdfba8fa2479fdc26b89ed1a2263062ee31..5647ff49b07beac9686e080835a45b70062fcad7 100644 (file)
@@ -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
index e764c2353a1625359f0190c5f708538ea827826e..1dce91b508804f75d4f15a75094e10af48826122 100644 (file)
@@ -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
index 70e11873f9fc89587f6ccf6c194e52de1319f684..68bffd4b28b83ea5f6b0a727ae5f8307a7d00e34 100644 (file)
@@ -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