在golang中,我们使用cgo可以调用c++库,但是调用的库怎么调试是个问题
以windows为例,golang环境使用gcc 5.3 win64编译,所有的库也使用相同编译器编译
待调试的库添加-ggdb -O0参数
整个go程序调试的话可以使用go build编译出执行程序再gdb,但是单个单元测试模块调试的化就需要使用dlv进行debug.test编译,编译命令:
dlv.exe test 模块路径 -- -test.run 用例名称
产生debug.test文件,但是存在一个问题,当dlv退出的时候生成的文件会被删除,所以此时需要杀死dlv进程保留文件,再进行gdb调试
编译过程写了一个批处理:
@echo off
set nowpath=%CD%
set curpath=
set start=0
set target=debug.test
if "%1" == "" ( goto :getmodel ) else (
set curpath=%1
goto :buildtest
)
:getmodel
for /f "tokens=1* delims=\" %%a in ("%nowpath%") do (
if "%%a" == "src" (
set start=1
)
if "%start%" == "1" (
if "%curpath%" == "" (
set curpath=%%a
) else (
set curpath=%curpath%\%%a
)
)
set nowpath=%%b
)
if defined nowpath ( goto :getmodel )
:buildtest
del /f /s %target%
echo "input test name"
set /p testname=
if "%testname%" == "" (
goto :end
) else (
::start dlv.exe test %curpath% --headless=true --listen=127.0.0.1:11890 -- -test.run %testname%
start /min dlv.exe test %curpath% -- -test.run %testname%
for /l %%i in (1,1,100) do (
if exist %target% (
taskkill /f /t /im dlv.exe
goto :end
) else (
ping 127.0.0.1 -n 6 > nul
)
)
)
:end
使用vscode 进行c++调试,需配置launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "src/xxxx/cccc/services/debug.test",
"args": [],
"stopAtEntry": false,
"cwd": "src/xxxx/cccc/services",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "D:/GNU/mingw64/bin/gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
设置program,cwd,miDebuggerPath路径,f5就可以不使用可怜的gdb控制台