Vim同步断点到WinDbg

其实这篇文章是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中设置debuggerwindbg.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的博客

没有评论: