程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

GO语言(二十四):诊断工具(下)(go语言断言)

balukai 2025-07-08 16:33:47 文章精选 3 ℃

调试

调试是识别程序行为异常的过程。调试器使我们能够了解程序的执行流程和当前状态。有几种调试方式;本节将只关注将调试器附加到程序和核心转储调试。

Go 用户主要使用以下调试器:

  • Delve:Delve 是 Go 编程语言的调试器。它支持 Go 的运行时概念和内置类型。Delve 正试图成为 Go 程序的全功能可靠调试器。
  • GDB:Go 通过标准的 Go 编译器和 Gccgo 提供 GDB 支持。堆栈管理、线程和运行时包含与 GDB 期望的执行模型有很大不同的方面,即使程序是使用 gccgo 编译的,它们也会混淆调试器。尽管 GDB 可用于调试 Go 程序,但它并不理想并且可能会造成混乱。


调试器与 Go 程序的配合如何?

gc编译器会执行优化,例如函数内联和变量注册。这些优化有时会使使用调试器进行调试变得更加困难。在这些改进可用之前,我们建议在构建要调试的代码时禁用优化。以下命令构建一个没有编译器优化的包:

$ go build -gcflags=all="-N -l"

作为改进工作的一部分,Go 1.10 引入了一个新的编译器标志-dwarflocationlists。该标志使编译器添加帮助调试器使用优化的二进制文件的位置列表。以下命令构建了一个具有优化但具有 DWARF 位置列表的包:

$ go build -gcflags="-dwarflocationlists=true"


推荐的调试器用户界面是什么?

尽管 delve 和 gdb 都提供 CLI,但大多数编辑器集成和 IDE 都提供了特定于调试的用户界面。


是否可以使用 Go 程序进行事后调试?

核心转储文件是包含正在运行的进程的内存转储及其进程状态的文件。它主要用于对程序进行事后调试,并在程序仍在运行时了解其状态。这两种情况使调试核心转储成为事后分析和分析生产服务的良好诊断帮助。


运行时统计和事件

运行时为用户提供内部事件的统计信息和报告,以在运行时级别诊断性能和利用率问题。

用户可以监控这些统计数据,以更好地了解 Go 程序的整体运行状况和性能。一些经常监控的统计数据和状态:

  • runtime.ReadMemStats 报告与堆分配和垃圾收集相关的指标。内存统计信息对于监控进程消耗了多少内存资源、进程是否可以很好地利用内存以及捕获内存泄漏很有用。
  • debug.ReadGCStats 读取有关垃圾收集的统计信息。查看有多少资源用于 GC 暂停是很有用的。它还报告垃圾收集器暂停和暂停时间百分位数的时间线。
  • debug.Stack 返回当前堆栈跟踪。堆栈跟踪有助于查看当前正在运行的 goroutine 数量、它们在做什么以及它们是否被阻塞。
  • debug.WriteHeapDump 暂停所有 goroutine 的执行,并允许您将堆转储到文件中。堆转储是给定时间 Go 进程内存的快照。它包含所有已分配的对象以及 goroutine、终结器等。
  • runtime.NumGoroutine 返回当前 goroutine 的数量。可以监视该值以查看是否使用了足够的 goroutine,或者检测 goroutine 泄漏。


执行跟踪器

Go 带有一个运行时执行跟踪器来捕获广泛的运行时事件。调度、系统调用、垃圾回收、堆大小和其他事件由运行时收集,并可用于 go 工具跟踪的可视化。执行跟踪器是一种检测延迟和利用率问题的工具。您可以检查 CPU 的使用情况,以及网络或系统调用何时成为 goroutine 抢占的原因。

跟踪器可用于:

  • 了解你的 goroutines 是如何执行的。
  • 了解一些核心运行时事件,例如 GC 运行。
  • 识别并行性较差的执行。

但是,它对于识别热点(例如分析内存或 CPU 使用率过高的原因)并不是很好。推荐使用分析工具来解决这些问题。


GODEBUG

如果相应地设置了 GODEBUG 环境变量,运行时也会发出事件和信息 。

  • GODEBUG=gctrace=1 在每次收集时打印垃圾收集器事件,汇总收集的内存量和暂停时间。
  • GODEBUG=inittrace=1 打印完成的包初始化工作的执行时间和内存分配信息的摘要。
  • GODEBUG=schedtrace=X 每 X 毫秒打印一次调度事件。


GODEBUG 环境变量可用于禁用在标准库和运行时中使用指令集扩展。

  • GODEBUG=cpu.all=off 禁用所有可选指令集扩展。
  • GODEBUG=cpu.extension =off 禁止使用来自指定指令集扩展的指令。

Tags:

最近发表
标签列表