网站首页 > 文章精选 正文
调试
调试是识别程序行为异常的过程。调试器使我们能够了解程序的执行流程和当前状态。有几种调试方式;本节将只关注将调试器附加到程序和核心转储调试。
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 禁止使用来自指定指令集扩展的指令。
- 上一篇: Golang高性能编程实践(golang实战项目)
- 下一篇: 15. 性能优化(性能优化什么意思)
猜你喜欢
- 2025-07-08 Rust编程语言之父都在用什么工具(rust编程语言怎么样)
- 2025-07-08 go语言中性能分析工具pprof使用心得
- 2025-07-08 爱上开源之golang入门至实战第三章-内存逃逸
- 2025-07-08 GO 编程:Golang的协程调度器原理及GMP设计思想
- 2025-07-08 Go语言核心36讲(新年彩蛋)--学习笔记
- 2025-07-08 c语言中堆和栈的区别(c语言堆和栈的概念和区别)
- 2025-07-08 Go 语言内存管理(一):系统内存管理
- 2025-07-08 深入解读Raft算法与etcd工程实现(etcd raft库原理)
- 2025-07-08 Go语言中的性能考虑和优化(go语言的效率)
- 2025-07-08 高性能 Go 的 6 个技巧 — Go 高级主题
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)