ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Delve(dlv)命令行完全指南:根命令、全局选项与全部调试子命令详解

Delve(dlv)命令行完全指南:根命令、全局选项与全部调试子命令详解 开发工具【免费下载链接】delveDelve is a debugger for the Go programming language.项目地址https://gitcode.com/gh_mirrors/de/delve点击查看免费下载Delve 是 Go 编程语言的调试器其命令行入口统一由dlv根命令承载。本文以仓库中自动生成的根命令使用文档 Documentation/usage/dlv.md 为主体结合 cmd/dlv/cmds/commands.go 的命令树实现与 Documentation/usage/README.md 的使用场景说明系统讲解dlv根命令的语法、全局选项、--参数透传机制以及attach、connect、core、dap、debug、exec、replay、test、trace、version、log、backend等全部子命令的用法让读者能够按需选择正确的启动方式并理解底层实现。dlv 是什么Delve 是一个面向 Go 程序的源码级调试器source level debugger。与基于 GDB 等通用调试器的方案不同Delve 深度理解 Go 的运行时、goroutine、channel 与内联函数等特性其官方文档将其目标定义为为调试 Go 程序提供一个简单而强大的接口a simple yet powerful interface for debugging Go programs。dlv命令允许你与程序进行交互具体能力包括控制进程执行运行、暂停、单步、继续甚至在录制回放下反向执行求值变量读取与修改程序变量、表达式获取线程 / goroutine 状态列出、切换 goroutine 与线程查看 CPU 寄存器状态打印寄存器内容以及查看调用栈、源码、类型、包、函数、动态库等丰富信息。从源码结构看dlv可执行文件的入口位于 cmd/dlv/main.go它启动遥测telemetry.Start在CGO_CFLAGS环境变量未设置时将其默认设为-O0 -g关闭优化并保留调试信息这正是 Delve 能可靠调试 cgo 代码的前提随后调用cmds.New(false).Execute()进入由 Cobra 框架构建的完整命令树 cmd/dlv/cmds/commands.go。根命令语法与 Synopsisdlv根命令的使用文档Documentation/usage/dlv.md给出的核心描述如下Delve is a source level debugger for Go programs. Delve enables you to interact with your program by controlling the execution of the process, evaluating variables, and providing information of thread / goroutine state, CPU register state and more. The goal of this tool is to provide a simple yet powerful interface for debugging Go programs.在源码中这段描述被定义为根命令的Long说明cmd/dlv/cmds/commands.go而Short描述为 Delve is a debugger for the Go programming language.。通过--向目标程序传递参数dlv根命令支持一种关键的参数透传机制使用--分隔符把后续所有参数原样传递给被调试的程序。官方文档给出的示例为dlv exec ./hello -- server --config conf/config.toml这条命令等价于先用dlv exec启动并调试预编译好的./hello二进制然后向hello进程本身传递server --config conf/config.toml这组启动参数。这在调试带命令行参数的服务器程序如配置文件路径、监听端口等时非常常用。同样的模式也适用于其他子命令例如dlv test中可用--传递-test.run等 go test 标志dlv test [package] -- -test.run TestSomething -test.v -other-argument根命令选项dlv根命令自身只暴露一个帮助选项-h, --help help for dlv而真正承载调试能力的是庞大的全局持久化标志与各子命令标志详见下文。全局持久化选项影响所有子命令在 cmd/dlv/cmds/commands.go 中这些选项通过rootCommand.PersistentFlags()注册因此对debug、exec、attach、test、trace等几乎所有子命令都生效。下表完整罗列了这些全局选项及其默认值与作用选项默认值说明-l, --listen string127.0.0.1:0调试服务器监听地址以unix:前缀可改用 Unix domain socket--logfalse启用调试服务器日志--log-output string空逗号分隔的日志组件列表见dlv help log可选值包括debugger、gdbwire、lldbout、debuglineerr、rpc、dap、fncall、minidump、stack--log-dest string空将日志写入指定文件或文件描述符--headlessfalse仅运行调试服务器无终端同时接受 JSON-RPC 或 DAP 客户端连接--accept-multiclientfalse允许 headless 服务器接受多个客户端连接JSON-RPC 或 DAP--api-version int2headless 模式下选用的 JSON-RPC API 版本唯一有效值是 2可通过RPCServer.SetApiVersion重置详见 Documentation/api/json-rpc/README.md--init string空终端客户端启动时执行的初始化文件--build-flags string平台相关传给编译器的构建标志例如--build-flags-tagsintegration -modvendor -cover -vWindows 上对旧版 Go 会自动附加-ldflags-linkmode internal以规避 golang/go#13154--wd string空目标程序的工作目录--check-go-versiontrue当本机 Go 版本与 Delve 不兼容过旧或过新时直接退出--only-same-usertrue仅允许与启动该 Delve 实例的用户相同的连接接入headless 安全选项--backend stringdefault后端选择可选default、native、lldb、rr详见dlv help backend-r, --redirect stringArray[]目标进程的重定向规则见dlv help redirect--allow-non-terminal-interactivefalse允许 stdin/stdout/stderr 不是终端的交互式会话--disable-aslrfalse禁用地址空间随机化ASLR需要说明的是--headless与终端模式的组合构成了 Delve 两种典型使用形态见 Documentation/usage/README.md不指定--headlessDelve 自动启动默认的终端客户端进入交互式调试界面指定--headless只启动后端服务器进入调试会话后等待客户端通过 JSON-RPC 或 DAP 连接可与dlv connect、VS Code Go、GoLand 等前端配合实现远程调试。子命令全景SEE ALSO 详解dlv根命令文档的 SEE ALSO 部分列出了全部子命令其实际注册代码位于 cmd/dlv/cmds/commands.go。按使用场景可划分为以下五类。1. 指定目标并启动调试默认终端界面这一类子命令都会在启动后进入默认的终端交互界面dlv debug [package]— 编译并以禁用优化的方式启动调试文档默认编译当前目录下的main包并开始调试也可指定其他包名。Delve 会以关闭优化-gcflagsall-N -l的方式编译目标以保证变量求值与单步调试的准确性。特有选项--continue 调试进程启动后立即继续运行 --output string 编译产物的输出路径 --rr-cleanup 分离时删除包含调试录制的目录默认 true --tty string 目标程序使用的 TTYdlv test [package]— 编译测试二进制并开始调试文档以禁用优化的方式编译测试二进制并进入调试会话。默认调试当前目录的测试也可指定包。用--分隔符向测试程序传递参数如-test.run、-test.v。特有选项--output string。dlv exec path/to/binary— 执行预编译二进制并开始调试文档Delve 会 exec 该二进制并立即附加开始调试。注意若二进制编译时未禁用优化调试体验会大打折扣。官方建议在 Go 1.10 及以后使用-gcflagsall-N -l编译调试用二进制更早版本使用-gcflags-N -l。特有选项与debug相同--continue、--tty、--rr-cleanup。dlv attach pid [executable]— 附加到正在运行的进程文档Delve 接管一个已运行进程并开启新调试会话退出时会询问是让进程继续运行还是将其杀死。在源码中该子命令要求必须提供 PID否则报错 you must provide a PIDcommands.go。特有选项--continue 附加后继续运行被调试进程 --waitfor string 等待名称以该前缀开头的进程出现 --waitfor-interval float 进程列表轮询间隔毫秒默认 1 --waitfor-duration float 等待进程的总时长dlv core executable core— 检查核心转储文件文档打开指定的 core 文件与对应可执行文件检查转储时进程的状态。当前支持 linux/amd64、linux/arm64 的 core 文件、windows/amd64 的 minidump以及 Delvedump命令生成的 core 文件。源码中还隐藏了一个-c标志以便与coredumpctl兼容commands.go。dlv replay [trace directory]— 回放 rr 录制轨迹文档打开 mozilla rr 生成的录制轨迹进行回放调试。该子命令仅在检测到系统安装了rrexec.LookPath(rr)时才会注册commands.go并自动将后端切换为rr、禁用rr-cleanup。2. 追踪目标程序执行dlv trace [package] regexp— 编译并开始追踪程序文档在所有匹配正则表达式的函数上设置 tracepoint追踪点命中时输出信息适合只想了解进程执行了哪些函数、而不想进入完整调试会话的场景。追踪输出打印到 stderr因此可通过重定向 stdout 来只保留追踪结果。特有选项--ebpf 使用 eBPF 追踪实验性 -e, --exec string 要执行并追踪的二进制文件 --follow-calls int 递归追踪子函数到指定深度支持 defer 函数与动态返回/传参的函数 --output string 编译产物输出路径 -p, --pid int 要附加的 PID -s, --stack int 显示指定深度的堆栈--ebpf 模式下忽略 -t, --test 追踪测试二进制 --timestamp 输出中显示时间戳 -v, --verbose int 参数详细度0值, 1类型, 2内联, 3展开, 4完整默认 03. 启动 headless 后端与远程客户端dlv --headless command target args— headless 调试服务器见 Documentation/api/ClientHowto.md#spawning-the-backend只启动服务器、进入指定目标的调试会话并等待客户端通过 JSON-RPC 或 DAP 接入。command可为debug、test、exec、attach、core或replay中的任意一个。若不指定--headless则会自动启动默认终端客户端。可与 dlv connect、VS Code Go、GoLand 等配合实现远程调试。dlv dap— 纯 DAP 服务器文档启动一个始终 headless、仅通过 Debug Adaptor ProtocolDAP通信的 TCP 服务器要求 DAP 客户端如 VS Code连接并通过 launch/attach 配置指定目标。客户端 launch 配置可指定的模式包括launch exec执行预编译二进制同dlv execlaunch debug编译并启动同dlv debuglaunch test编译并测试同dlv testlaunch replay回放 rr 轨迹同dlv replaylaunch core回放 core 文件同dlv coreattach local附加运行中的进程同dlv attach注意事项程序路径与输出二进制路径相对 dlv 的工作目录解释该服务器不接受多客户端连接--accept-multiclient如需多客户端应改用dlv [command] --headless配合 DAP 的 attach remote 配置不支持--continue可通过 launch/attach 的stopOnEntry属性控制会话开始时是否恢复执行。特殊标志--client-addr让服务器主动拨号到等待中的 DAP 客户端支持unix:前缀会话结束后服务器进程退出。dlv connect addr— 用终端客户端连接 headless 服务器文档启动一个终端界面客户端并通过 JSON-RPC 连接到正在运行的 headless 服务器地址同样支持unix:前缀。注意dlv connect只与--headless模式兼容不兼容dlv dap启动的服务器。4. 帮助类子命令dlv help [command]根命令帮助入口可查看任意子命令的详细用法dlv log关于日志标志的帮助文档dlv backend关于--backend标志的帮助文档dlv redirect关于--redirect重定向规则的帮助文档dlv version打印版本信息文档可用-v输出详细构建信息version.BuildInfo()。另外仓库中还存在一个已废弃的run子命令其输出提示 This command is deprecated, please use debug instead.在命令树中标记为隐藏commands.go新代码应统一使用debug。环境变量Delve 还会读取以下环境变量见 Documentation/usage/README.md环境变量作用$DELVE_EDITOR供edit命令使用未设置时回退到$EDITOR$DELVE_PAGER供输出量较大的命令使用未设置时回退到$PAGER两者均未设置则使用more$TERM决定是否使用 ANSI 转义码进行彩色输出$DELVE_DEBUGSERVER_PATH在 macOS 上定位 debugserver 可执行文件此外入口程序 cmd/dlv/main.go 还会在CGO_CFLAGS未设置时将其预设为-O0 -g以保证 cgo 代码的可调试性。配置与命令历史文件位置终端客户端的行为由配置文件config.yml控制命令历史存储在.dbg_history中。文件位置遵循 XDG 规范Documentation/cli/README.md若设置了$XDG_CONFIG_HOME则位于$XDG_CONFIG_HOME/dlv否则在 Linux 上位于$HOME/.config/dlv在其他系统上位于$HOME/.dlv。所有可配置项及其默认值见 Documentation/cli/config.md。终端客户端命令速查启动调试会话后进入的终端界面提供了一组功能强大的交互命令按功能分类速查如下完整语法参见 Documentation/cli/README.md类别命令运行控制continuec、nextn、steps、stepoutso、step-instruction、next-instruction、restart、rewindrw、rev、rebuild断点管理breakb、breakpointsbp、clear、clearall、conditioncond、on、toggle、tracet、watch变量与内存printp、set、locals、args、vars、examinememx、display、regs、whatis线程与 goroutinegoroutinegr、goroutinesgrs、threadtr、threads调用栈与帧stackbt、frame、up、down、deferred其他listls/l、disassemble、dump、source、config、edit、funcs、types、packages、sources、libraries、checkpoint、transcript、target、exitquit/q其中若干命令与本文主题直接相关condition支持-hitcount、-per-g-hitcount与-clear三种形态表达式语法见 Documentation/cli/expr.md条件求值机制见 Documentation/cli/cond.mdbreak的位置定位符locspec支持address、filename:line、line、offset、-offset、function[:line]、/regex/七种形式详见 Documentation/cli/locspec.mdsource命令可执行命令文件.star结尾的文件会作为 Starlark 脚本解释Documentation/cli/starlark.md仓库_fixtures/目录下如amend_breakpoint.star、linked_list.star即有大量可直接参考的示例脚本。总结如何选择正确的 dlv 启动方式场景推荐命令调试当前目录的 Go 程序dlv debug调试预编译的二进制dlv exec ./binary附加到运行中的进程dlv attach pid调试单元测试dlv test [package]追踪函数调用dlv trace [package] regexp检查崩溃转储dlv core exe core回放录制轨迹dlv replay trace需安装 rr远程/编辑器集成JSON-RPCdlv --headless debugdlv connect或编辑器前端编辑器集成DAP如 VS Codedlv dap最后提醒完整的命令用法以仓库中自动生成的 dlv.md 及各子命令文档Documentation/usage/ 目录为准终端内随时可用dlv help [command]查看。赞分享开发工具【免费下载链接】delveDelve is a debugger for the Go programming language.项目地址https://gitcode.com/gh_mirrors/de/delve点击查看免费下载相关推荐git-sim命令行参数完全手册全局选项与子命令详解git sim命令行参数完全手册全局选项与子命令详解 git sim是一个强大的Git可视化模拟工具通过单个终端命令就能在您自己的仓库中 视觉化模拟Git操开发工具VeleroArkCLI 参考ark 根命令、全局选项与子命令体系完全指南VeleroArkCLI 参考ark 根命令、全局选项与子命令体系完全指南 本文以仓库 site/content/docs/v0.4.0/cli refe云原生灾备存储后端Linera CLI 命令完全参考linera 命令行工具的全局选项、全部子命令与源码级解析Linera CLI 命令完全参考 linera 命令行工具的全局选项、全部子命令与源码级解析 linera 是 Linera 协议的官方客户端实现与命令行工区块链Web3上一篇如何用AI多智能体技术打造你的私人投资顾问TradingAgents-CN完整指南下一篇COZE-DISCORD-PROXY 项目API接口详解与技术解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进