Delve 用来调试 Go 语言开发的程序,该工具的目标是为 Go 语言提供一个简单、功能齐全的调试工具。
$ go install github.com/go-delve/delve/cmd/dlv@latest
# 安装完成后查看版本
$ dlv verison
Delve Debugger
Version: 1.20.1
Build: $Id: 96e65b6c615845d42e0e31d903f6475b0e4ece6e我们首先从一个简单的示例程序开始,改程序打印字符串 hello world, 然后结束并退出。
// main.go
package main
func main() {
println("hello world")
}$ dlv debug main.go
# Type 'help' for list of commands.
(dlv)
# 输入 help 查看参数说明
(dlv) help
The following commands are available:
Running the program:
call ------------------------ Resumes process
...
...
types ---------------------- Print list of types
Type help followed by a command for full documentation.
# 运行程序
(dlv) continue
hello world
Process 3637 has exited with status 0# 编译源文件
$ go build -o main main.go
$ dlv exec ./main
Type 'help' for list of commands.
(dlv)
# 接下来的步骤和调试源文件的一样,这里不再赘述为了让进程保持在运行状态,我们在程序中加一行休眠代码:
package main
import "time"
func main() {
time.Sleep(time.Minute)
println("hello world")
}调试前先运行程序:
$ go run main.go
# 查看进程 ID
$ ps -ef | grep "go run main.go"
7602 27666 0 21:30 pts/6 00:00:00 go run main.go
# 调试进程
$ dlv attach 7602
Type 'help' for list of commands.
(dlv)
...
# 1 分钟之后,main.go 并未正常退出,因为当前正在调试
# 输入 continue 继续运行
(dlv) continue
Process 7602 has exited with status 0下列命令是启动 dlv 调试后可用的命令 (也就是当前命令行变为 (dlv) 之后可用)。
命令 | 描述 |
call | 恢复进程,调用函数 (实验阶段) |
continue | 继续运行程序,直到遇到断点或程序结束 |
next | 单步调试 |
restart | 重新运行 |
step | 单步调试某个函数 |
step-instruction | 单步调试某个 CPU 指令 |
stepout | 从当前函数跳出 |
命令 | 描述 |
break | 设置断点 |
breakpoints | 打印所有断点 |
clear | 删除断点 |
clearall | 删除所有断点 |
condition | 设置条件断点 |
on | 设置一个断点触发时执行的命令 |
toggle | 打开/关闭 断点 |
命令 | 描述 |
args | 打印函数参数 |
display | 每次程序停止时打印表达式的值 |
examinemem | 解析给定地址的内存 |
locals | 打印本地变量 |
print | 解析一个表达式 |
regs | 打印寄存器信息 |
set | 设置变量的值 |
vars | 打印包内变量 |
whatis | 打印类型信息 |
命令 | 描述 |
goroutine | 打印或切换 goroutine |
goroutines | 打印所有 goroutine |
thread | 切换到指定的线程 |
threads | 打印所有线程信息 |
命令 | 描述 |
deferred | 在 defer 上下文中执行命令 |
frame | 设置当前帧,或在不同的帧上执行命令 |
stack | 打印堆栈信息 |
命令 | 描述 |
config | 更改配置参数 |
disassemble | 反汇编 |
dump | dump core |
exit | 结束调试,也可以用 |
最后,我们使用一个的小例子,熟悉下常用的几个命令。
示例程序代码如下:
// main.go
package main
var (
x = 1024
)
func main() {
for i := 0; i < 5; i++ {
println(i)
}
}# 开始调试
$ dlv debug main.go
Type 'help' for list of commands.
(dlv)
# 增加断点
(dlv) b main.main
Breakpoint 1 set at 0x45f0c6 for main.main() ./main.go:7
# 查看断点
(dlv) bp
...
Breakpoint 2 (enabled) at 0x45f0c6 for main.main() ./main.go:7 (0)
# 运行程序
(dlv) continue
> main.main() ./main.go:7 (hits goroutine(1):1 total:1) (PC: 0x45f0c6)
2:
3: var (
4: x = 1024
5: )
6:
=> 7: func main() {
8: for i := 0; i < 5; i++ {
9: println(i)
10: }
11: }
12:
# 可以看到,程序停在了设置的断点上
# 打印包变量
(dlv) vars vars main.x
...
main.x = 1024
...
# 单步调试
(dlv) next
> main.main() ./main.go:8 (PC: 0x45f0d4)
3: var (
4: x = 1024
5: )
6:
7: func main() {
=> 8: x = 0
9: for i := 0; i < 5; i++ {
10: println(i)
11: }
12: }
13:
# 再次单步调试
(dlv) next
> main.main() ./main.go:9 (PC: 0x45f0df)
4: x = 1024
5: )
6:
7: func main() {
8: x = 0
=> 9: for i := 0; i < 5; i++ {
10: println(i)
11: }
12: }
13:
14: //timeout := time.After(time.Minute)
# 可以看到,程序停在了循环语句
# 打印包变量
(dlv) vars main.x
main.x = 0
# 再次单步调试
(dlv) next
> main.main() ./main.go:10 (PC: 0x45f0f4)
5: )
6:
7: func main() {
8: x = 0
9: for i := 0; i < 5; i++ {
=> 10: println(i)
11: }
12: }
13:
14: //timeout := time.After(time.Minute)
15: //
# 打印本地变量
(dlv) locals
i = 0
# 查看堆栈信息
(dlv) stack
0 0x000000000045f0f4 in main.main
at ./main.go:10
1 0x00000000004358b8 in runtime.main
at /usr/local/go/src/runtime/proc.go:250
2 0x000000000045c0c1 in runtime.goexit
at /usr/local/go/src/runtime/asm_amd64.s:1594
# 打印 goroutine 信息
(dlv) goroutine
Thread 27873 at ./main.go:10
Goroutine 1:
...
# 删除所有断点
(dlv) clearall
Breakpoint 1 cleared at 0x45f0c6 for main.main() ./main.go:7
# 继续执行
(dlv) continue
1
2
3
4
Process 27873 has exited with status 0
# 退出调试
(dlv) exitDelve 支持以插件的形式集成到主流的 IDE 里面,具体的支持列表请看 这个页面[1]。
一般是被编译器优化了,比如内联会导致 dlv 单步调试无法打印某些变量,解决方法是禁止编译优化。
# 禁用内联和优化 (细节可以阅读引用文章列表)
go run -gcflags "-N -l" main.go[1] 这个页面: https://github.com/go-delve/delve/blob/master/Documentation/EditorIntegration.md
[2] go-delve/delve: https://github.com/go-delve/delve
[3] 如何定位 golang 进程 hang 死的 bug: https://xargin.com/how-to-locate-for-block-in-golang/
[4] Debugging with GDB: https://sourceware.org/gdb/current/onlinedocs/gdb.html/
[5] 100-gdb-tips: https://github.com/hellogcc/100-gdb-tips
[6] 深入 Go 语言 - 11: https://colobu.com/2016/07/04/dive-into-go-11/
[7] WSL2 安装 perf: https://gist.github.com/abel0b/b1881e41b9e1c4b16d84e5e083c38a13
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear