一、Go基础知识41、调试:DLV工具——相关命令详解

一、dlv --help - 查看 Delve 调试器的帮助信息

  • 解释: 该命令用于查看 Delve 调试器的帮助信息,提供了有关 Delve 的基本介绍以及可用命令和选项的详细说明。
  • 使用方式: 在命令行中输入 dlv --help
  • 导致结果: 显示 Delve 调试器的帮助信息,包括调试器的目标、基本使用方式、可用命令列表以及其他帮助主题的链接。

Delve 是用于 Go 程序的源码级调试器,它能够通过控制进程的执行、评估变量以及提供线程/ goroutine 状态、CPU 寄存器状态等信息来与程序交互。该工具旨在为调试 Go 程序提供简单而强大的界面。

可以通过 -- 标志将标志传递给要调试的程序,例如:

dlv exec ./hello -- server --config conf/config.toml

Available Commands

  • attach: 附加到正在运行的进程并开始调试。
  • connect: 连接到headless调试服务器,使用终端客户端进行通信。
  • core: 检查核心转储文件。
  • dap: 启动通过 Debug Adaptor Protocol (DAP) 进行通信的无头 TCP 服务器。
  • debug: 编译并开始调试当前目录中的主包或指定的包。
  • exec: 执行预编译的二进制文件,并开始调试会话。
  • help: 获取有关任何命令的帮助。
  • test: 编译测试二进制文件并开始调试程序。
  • trace: 编译并开始跟踪程序。
  • version: 打印版本信息。

Additional help topics

  • dlv backend: 关于 --backend 标志的帮助。
  • dlv log: 关于日志标志的帮助。
  • dlv redirect: 关于文件重定向的帮助。

使用 dlv [command] --help 获取有关特定命令的更多信息。

二、dlv attach - 连接到已运行的进程并开始调试

  • 解释: 此命令将使 Delve 接管已经运行的进程并开始新的调试会话。在退出调试会话时,可以选择让进程继续运行或终止它。

  • 使用方式: dlv attach pid [executable] [flags],连接到指定进程进行调试。可提供进程ID,可执行文件路径,以及一些标志参数。

  • 导致结果: Delve 接管指定进程,使能够在调试会话中检查、修改和控制该进程的执行。

    • --continue 在启动时继续调试过程。
    • --waitfor 等待具有以指定前缀开头的名称的进程。
    • --waitfor-duration 等待进程的总时间。
    • --waitfor-interval 进程列表检查之间的间隔时间。
  • 全局标志:

    • --accept-multiclient 允许headless服务器通过 JSON-RPC 或 DAP 接受多个客户端连接。
    • --allow-non-terminal-interactive 允许没有终端作为标准输入、输出和错误的 Delve 交互式会话。
    • --api-version 选择 JSON-RPC API 版本。新客户端应使用 v2。可以通过 RPCServer.SetApiVersion 重置。查看文档/api/json-rpc/README.md。(默认值 1)
    • --backend 后端选择(参见 ‘dlv help backend’)。(默认值 “default”)
    • --check-go-version 如果使用的 Go 版本与 Delve 版本不兼容(太旧或太新),则退出。(默认值 true)
    • --headless 仅以headless模式运行调试服务器。服务器将接受 JSON-RPC 或 DAP 客户端连接。
    • --init 初始化文件,由终端客户端执行。
    • -l--listen 调试服务器的监听地址。(默认值 “127.0.0.1:0”)
    • --log 启用调试服务器日志记录。
    • --log-dest 将日志写入指定的文件或文件描述符(参见 ‘dlv help log’)。
    • --log-output 应该生成调试输出的组件的逗号分隔列表(参见 ‘dlv help log’)。
    • --only-same-user 仅允许来自启动此 Delve 实例的相同用户的连接。(默认值 true)

三、dlv connect - 连接到运行中的headless调试服务器

  • 解释: 此命令用于连接到正在运行的headless调试服务器,并使用终端客户端进行交互。

  • 使用方式: dlv connect addr [flags],通过指定的地址连接到正在运行的调试服务器。可以提供一些标志参数。

  • 导致结果: 与运行中的headless调试服务器建立连接,允许用户通过终端客户端与调试服务器进行交互。

    • --backend 后端选择(参见 ‘dlv help backend’)。(默认值 “default”)
    • --init 初始化文件,由终端客户端执行。
    • --log 启用调试服务器日志记录。
    • --log-dest 将日志写入指定的文件或文件描述符(参见 ‘dlv help log’)。
    • --log-output 应该生成调试输出的组件的逗号分隔列表(参见 ‘dlv help log’)。
  • 全局标志:

    扫描二维码关注公众号,回复: 17154293 查看本文章
    • --backend 后端选择(参见 ‘dlv help backend’)。(默认值 “default”)
    • --init 初始化文件,由终端客户端执行。
    • --log 启用调试服务器日志记录。
    • --log-dest 将日志写入指定的文件或文件描述符(参见 ‘dlv help log’)。
    • --log-output 应该生成调试输出的组件的逗号分隔列表(参见 ‘dlv help log’)。

四、dlv core - 分析核心转储文件

  • 解释: 此命令用于分析核心转储文件,仅支持Linux和Windows核心转储。此命令允许使用Delve分析核心转储文件,以了解进程在生成核心转储时的状态。

  • 使用方式: dlv core <executable> <core> [flags],打开指定的核心文件和相关的可执行文件,允许检查在生成核心转储时进程的状态。

  • 导致结果: Delve会加载指定的核心文件和相关的可执行文件,使能够在核心转储生成时检查进程的状态。

    • <executable> 可执行文件的路径。
    • <core> 核心转储文件的路径。
  • 全局标志:

    • --accept-multiclient 允许headless服务器通过JSON-RPC或DAP接受多个客户端连接。
    • --allow-non-terminal-interactive 允许没有终端作为标准输入、输出和错误的交互式Delve会话。
    • --api-version 在headless模式下选择JSON-RPC API版本。新客户端应使用v2。可以通过RPCServer.SetApiVersion重置。查看文档/api/json-rpc/README.md。(默认值 1)
    • --check-go-version 如果正在使用的Go版本与Delve版本不兼容(太旧或太新),则退出。(默认值 true)
    • --headless 仅以headless模式运行调试服务器。服务器将接受JSON-RPC或DAP客户端连接。
    • --init 由终端客户端执行的初始化文件。
    • -l--listen 调试服务器的监听地址。(默认值 “127.0.0.1:0”)
    • --log 启用调试服务器日志记录。
    • --log-dest 将日志写入指定的文件或文件描述符(参见 ‘dlv help log’)。
    • --log-output 应该生成调试输出的组件的逗号分隔列表(参见 ‘dlv help log’)。
    • --only-same-user 仅允许来自启动此Delve实例的相同用户的连接。(默认值 true)

五、dlv dap - 启动通过Debug Adaptor Protocol (DAP)通信的headless TCP服务器

  • 解释: 此命令用于启动一个headless的TCP服务器,通过Debug Adaptor Protocol (DAP)与DAP客户端通信。

  • 使用方式: dlv dap [flags],启动一个headless的TCP服务器,等待DAP客户端连接,并根据客户端的启动配置执行相应操作,如启动已编译的二进制文件、构建并启动、构建并测试、回放rr跟踪、回放核心转储文件或附加到正在运行的进程。

  • 导致结果: 服务器处于headless模式,要求DAP客户端(如VS Code)连接并请求启动二进制文件或附加到进程。支持的启动模式包括launch + exec、launch + debug、launch + test、launch + replay、launch + core、attach + local。

    • --client-addr DAP客户端等待DAP服务器拨号的主机:端口。使用此标志使服务器在启动时拨号到指定的主机:端口,开始调试会话。服务器进程将在调试会话结束时退出。
  • 全局标志:

    • --check-go-version 如果正在使用的Go版本与Delve版本不兼容(太旧或太新),则退出。(默认值 true)
    • --disable-aslr 禁用地址空间随机化。
    • -l--listen 调试服务器的监听地址。(默认值 “127.0.0.1:0”)
    • --log 启用调试服务器日志记录。
    • --log-dest 将日志写入指定的文件或文件描述符(参见 ‘dlv help log’)。
    • --log-output 应该生成调试输出的组件的逗号分隔列表(参见 ‘dlv help log’)。
    • --only-same-user 仅允许来自启动此Delve实例的相同用户的连接。(默认值 true)

六、dlv debug - 编译程序并启动/附加调试进程

  • 解释: 此命令用于在禁用优化的情况下编译程序,并启动或附加调试进程。

  • 使用方式: dlv debug [package] [flags],默认情况下,Delve将编译当前目录中的’main’包,并开始调试。还可以指定一个包名称,Delve将编译该包并开始一个新的调试会话。

  • 导致结果: 编译程序并启动/附加到调试进程。

    • [package] 包的名称,如果未指定,默认为’main’包。
  • 标志:

    • --continue 在启动时继续调试进程。
    • --output 二进制文件的输出路径。
    • --tty 用于目标程序的TTY。
  • 全局标志:

    • --accept-multiclient 允许headless服务器通过JSON-RPC或DAP接受多个客户端连接。
    • --allow-non-terminal-interactive 允许没有终端作为标准输入、输出和错误的交互式Delve会话。
    • --api-version 在headless模式下选择JSON-RPC API版本。新客户端应使用v2。可以通过RPCServer.SetApiVersion重置。查看文档/api/json-rpc/README.md。(默认值 1)
    • --backend 后端选择(参见 ‘dlv help backend’)。 (默认值 “default”)
    • --build-flags 传递给编译器的构建标志,例如:–build-flags=“-tags=integration -mod=vendor -cover -v”。
    • --check-go-version 如果正在使用的Go版本与Delve版本不兼容(太旧或太新),则退出。(默认值 true)
    • --disable-aslr 禁用地址空间随机化。
    • --headless 仅以headless模式运行调试服务器。服务器将接受JSON-RPC或DAP客户端连接。
    • --init 由终端客户端执行的初始化文件。
    • -l--listen 调试服务器的监听地址。(默认值 “127.0.0.1:0”)
    • --log 启用调试服务器日志记录。
    • --log-dest 将日志写入指定的文件或文件描述符(参见 ‘dlv help log’)。
    • --log-output 应该生成调试输出的组件的逗号分隔列表(参见 ‘dlv help log’)。
    • --only-same-user 仅允许来自启动此Delve实例的相同用户的连接。(默认值 true)
    • -r--redirect 为目标进程指定重定向规则(参见 ‘dlv help redirect’)。
    • --wd 运行程序的工作目录。

七、dlv exec - 执行预编译的二进制文件并开始调试会话

  • 解释: 执行预编译的二进制文件并立即附加到它,开始一个新的调试会话。

  • 使用方式: dlv exec <path/to/binary> [flags],这个命令会让Delve执行二进制文件,并立即附加到它上面,开始一个新的调试会话。

  • 导致结果: 执行预编译的二进制文件并开始调试会话。需要注意,如果二进制文件未禁用优化进行编译,可能会导致难以正确调试。建议在Go 1.10或更高版本上使用-gcflags="all=-N -l"编译调试二进制文件,在较早的Go版本上使用-gcflags="-N -l"

    • <path/to/binary> 二进制文件的路径。
  • 标志:

    • --continue 在启动时继续调试进程。
    • --tty 用于目标程序的TTY。
  • 全局标志:

    • --accept-multiclient 允许headless服务器通过JSON-RPC或DAP接受多个客户端连接。
    • --allow-non-terminal-interactive 允许没有终端作为标准输入、输出和错误的交互式Delve会话。
    • --api-version 在headless模式下选择JSON-RPC API版本。新客户端应使用v2。可以通过RPCServer.SetApiVersion重置。查看文档/api/json-rpc/README.md。(默认值 1)
    • --backend 后端选择(参见 ‘dlv help backend’)。 (默认值 “default”)
    • --check-go-version 如果正在使用的Go版本与Delve版本不兼容(太旧或太新),则退出。(默认值 true)
    • --disable-aslr 禁用地址空间随机化。
    • --headless 仅以headless模式运行调试服务器。服务器将接受JSON-RPC或DAP客户端连接。
    • --init 由终端客户端执行的初始化文件。
    • -l--listen 调试服务器的监听地址。(默认值 “127.0.0.1:0”)
    • --log 启用调试服务器日志记录。
    • --log-dest 将日志写入指定的文件或文件描述符(参见 ‘dlv help log’)。
    • --log-output 应该生成调试输出的组件的逗号分隔列表(参见 ‘dlv help log’)。
    • --only-same-user 仅允许来自启动此Delve实例的相同用户的连接。(默认值 true)
    • -r--redirect 为目标进程指定重定向规则(参见 ‘dlv help redirect’)。
    • --wd 运行程序的工作目录。

八、dlv test - 编译禁用优化的测试二进制文件并开始调试会话

  • 解释: 编译禁用优化的测试二进制文件并立即附加到它,开始一个新的调试会话。

  • 使用方式: dlv test [package] [flags],该命令允许在单元测试的上下文中开始新的调试会话。默认情况下,Delve将调试当前目录中的测试。还可以指定包名称,Delve将调试该包中的测试。双破折号 -- 可用于将参数传递给测试程序。

  • 导致结果: 编译禁用优化的测试二进制文件并开始调试会话。测试程序将在调试服务器中运行,允许逐步执行、设置断点等。

    • [package] 包的名称,指定要调试的测试程序所在的包。如果未指定,默认为当前目录中的测试。
  • 标志:

    • --help-h 显示有关dlv test命令的帮助信息。
    • --output 用于指定二进制文件输出路径的标志,指定测试二进制文件的输出路径。
  • 全局标志:

    • --accept-multiclient 允许headless服务器通过JSON-RPC或DAP接受多个客户端连接。
    • --allow-non-terminal-interactive 允许没有终端作为标准输入、输出和错误的交互式Delve会话。
    • --api-version 在headless模式下选择JSON-RPC API版本。新客户端应使用v2。可以通过RPCServer.SetApiVersion重置。查看文档/api/json-rpc/README.md。(默认值 1)
    • --backend 后端选择(参见 ‘dlv help backend’)。 (默认值 “default”)
    • --build-flags 传递给编译器的构建标志。例如:–build-flags=“-tags=integration -mod=vendor -cover -v”
    • --check-go-version 如果正在使用的Go版本与Delve版本不兼容(太旧或太新),则退出。(默认值 true)
    • --disable-aslr 禁用地址空间随机化。
    • --headless 仅以headless模式运行调试服务器。服务器将接受JSON-RPC或DAP客户端连接。
    • --init 由终端客户端执行的初始化文件。
    • -l--listen 调试服务器的监听地址。(默认值 “127.0.0.1:0”)
    • --log 启用调试服务器日志记录。
    • --log-dest 将日志写入指定的文件或文件描述符(参见 ‘dlv help log’)。
    • --log-output 应该生成调试输出的组件的逗号分隔列表(参见 ‘dlv help log’)。
    • --only-same-user 仅允许来自启动此Delve实例的相同用户的连接。(默认值 true)
    • -r--redirect 为目标进程指定重定向规则(参见 ‘dlv help redirect’)。
    • --wd 运行程序的工作目录。

九、dlv trace - 追踪程序执行

  • 解释: 追踪程序执行。通过 dlv trace 命令,可以设置跟踪点来了解程序正在执行的函数,输出将打印到 stderr,如果需要只看跟踪操作的输出,可以重定向 stdout。

  • 使用方式: dlv trace [package] regexp [flags],该命令设置一个跟踪点(tracepoint)在与提供的正则表达式匹配的每个函数上,并在命中跟踪点时输出信息。这在不想开始整个调试会话,只想知道进程正在执行哪些函数时非常有用。

    • [package] 包的名称,指定要追踪的程序所在的包。如果未指定,默认为当前目录中的程序。
    • regexp 正则表达式,用于匹配要追踪的函数。
  • 标志:

    • --ebpf 使用 eBPF 进行跟踪(实验性)。
    • -e--exec 要执行和跟踪的二进制文件。
    • --output 用于指定二进制文件输出路径的标志,指定跟踪的二进制文件的输出路径。
    • -p--pid 要附加到的进程 ID。
    • -s--stack 显示给定深度的堆栈跟踪。(在使用 --ebpf 时被忽略)
    • -t--test 跟踪测试二进制文件。
    • --timestamp 在输出中显示时间戳。
  • 全局标志:

    • --backend 后端选择(参见 ‘dlv help backend’)。 (默认值 “default”)
    • --build-flags 传递给编译器的构建标志。例如:–build-flags=“-tags=integration -mod=vendor -cover -v”
    • --check-go-version 如果正在使用的 Go 版本与 Delve 版本不兼容(太旧或太新),则退出。(默认值 true)
    • --disable-aslr 禁用地址空间随机化。
    • --log 启用调试服务器日志记录。
    • --log-dest 将日志写入指定的文件或文件描述符(参见 ‘dlv help log’)。
    • --log-output 应该生成调试输出的组件的逗号分隔列表(参见 ‘dlv help log’)。
    • -r--redirect 为目标进程指定重定向规则(参见 ‘dlv help redirect’)。
    • --wd 运行程序的工作目录。

十、dlv version - 查看dlv版本号

  • 解释: 查看dlv版本号。
  • 使用方式: dlv version

十一、dlv backend - Delve 调试器后端选择

  • 解释: 这个命令用于选择 Delve 调试器的后端,决定它在不同环境下的执行方式。允许在不同环境下选择 Delve 调试器的后端。
  • 使用方式: dlv backend,用于指定 Delve 调试器的后端选择。
  • 可能值:
    • default:在 macOS 上使用 lldb,在其他所有地方使用本地(native)后端。
    • native:本地后端。
    • lldb:使用 lldb-server 或 debugserver。
    • rr:使用 Mozilla rr(https://github.com/mozilla/rr)。

十二、dlv log - 启用 Delve 调试器日志记录

  • 解释: 该命令用于启用 Delve 调试器的日志记录功能。允许根据需要选择性地启用 Delve 调试器的不同组件的日志记录功能,并将日志写入指定的位置,以便更好地跟踪和调试程序执行过程中发生的事件和信息。

  • 使用方式: 通过指定 --log 标志并使用 --log-output 标志来选择产生日志的组件。

  • 可用组件列表:

    • debugger:记录调试器命令。
    • gdbwire:记录与 gdbserial 后端的连接。
    • lldbout:将 debugserver/lldb 的输出复制到标准输出。
    • debuglineerr:记录读取 .debug_line 文件时的可恢复错误。
    • rpc:记录所有 RPC 消息。
    • dap:记录所有 DAP 消息。
    • fncall:记录函数调用协议。
    • minidump:记录 minidump 加载信息。
    • stack:记录堆栈跟踪器的信息。
  • 附加选项:

    • --log-dest:用于指定日志记录的位置。如果参数是一个数字,则会被解释为文件描述符,否则作为文件路径。该选项还会重定向在headless模式和 DAP 模式下的 “server listening at” 消息。

十三、dlv redirect - 控制目标进程的标准文件描述符

  • 解释: 该命令用于控制目标进程的标准文件描述符。允许控制目标进程的标准文件描述符,以便在调试过程中对输入输出进行必要的重定向操作。
  • 使用方式: 使用 -r--tty 参数来控制目标进程的标准文件描述符。
    • --tty 参数允许将所有标准描述符重定向到一个终端,终端路径作为 --tty 参数的参数。
    • -r 参数的语法为:-r [source:]destination,其中 source 可以是 ‘stdin’、‘stdout’ 或 ‘stderr’ 中的一个,destination 是文件的路径。如果省略 source,则默认使用 stdin。
  • 导致结果: 可以通过该命令控制目标进程的标准文件描述符,从而实现输入输出的重定向。

猜你喜欢

转载自blog.csdn.net/weixin_49015143/article/details/134912297
今日推荐