其实这篇文章是Vim中的一键运行的扩展,从截图中可以看到如果我想设置断点还得再WinDbg
中输入命令非常麻烦,特别是想要设置多个断点。
其实我很早就实现了在打开WinDbg的时候自动在Vim光标所在行下断的功能,今天我简单的扩展了下支持下多个断点,并且使用上类似其他IDE。
首先在Vim中实现切换断点的功能:
hi def link Breakpoint DiffText
sign define breakpoint linehl=Breakpoint text=x
function! Breakpoint()
let line = line('.')
let items = sign_getplaced('%', {'name': 'breakpoint', 'lnum': line})[0]
if len(items['signs']) == 0
exe 'sign place 111 line='.line.' name=breakpoint'
else
sign unplace
endif
endfunction
function! Get_all_breakpoint()
let breakpoints = []
for item in sign_getplaced()
for sign_ in item['signs']
call add(breakpoints, {'bufnr': item['bufnr'], 'lnum': sign_['lnum']})
endfor
endfor
return breakpoints
endfunction
command! Breakpoint :call Breakpoint()
command! BpClean :exe 'sign unplace 111 group=*'
这样call Breakpoint()
就可以正常在当前光标所在行设置和取消断点,之后我们要用到AsyncRun
的-post
参数实现编译后启动调试的功能:
AsyncRun -post=call\ AfterBuildDebug('test.exe') xmake build
AfterBuildDebug的实现:
function! AfterBuildDebug(module)
10copen | wincmd p
if g:asyncrun_status !=# 'success' | return | endif
let output = []
let dbgfile = $TEMP.'/vim/windbg.txt'
for item in Get_all_breakpoint()
let curfile = fnamemodify(bufname(item['bufnr']), ':t')
if curfile !=# ''
call add(output, printf('bu `%s!%s:%d`', a:module, curfile, item['lnum']))
endif
endfor
call add(output, 'g')
call writefile(output, dbgfile, 'w')
AsyncRun xmake r -d
endfunction
AfterBuildDebug主要就是实现在xmake build
之后检查是否编译成功,然后把在Vim
中设置的断点以WinDbg命令的形式写入windbg.txt
中。
之后需要在xmake
中设置debugger
为windbg.bat
xmake f -a x86 -m debug --debugger="D:/windbg.bat"
windbg.bat
中代码:
@echo off
set DBG_EXE=D:\Develop\WinDbg\x86\windbg.exe
set REMOTE_SYM_URL=https://msdl.microsoft.com/download/symbols
set LOCAL_SYM_URL=E:\3rdParty\symbols\win10
set DBG_CMD_FILE=%TEMP%\vim\windbg.txt
set DBG_ARG=
if exist "%DBG_CMD_FILE%" (
set DBG_ARG=; $^<%DBG_CMD_FILE%
)
if "%~1"=="" (set param=) else (set param="%*")
start %DBG_EXE% -W Default -y SRV*%LOCAL_SYM_URL%*%REMOTE_SYM_URL% -c ".load hs%DBG_ARG%" %param%
之后就可以成功实现自动同步Vim断点到WinDbg中:
转载请注明: 本文《Vim同步断点到WinDbg》来源于bstaint的博客
没有评论:
发表评论