go dlv
dlv
dlv
是golang
的调试工具
简易例子
|
|
cd
代码根目录
|
|
|
|
break
设置一个断点
|
|
breakpoints
查看设置的断点
|
|
vars
查看全部包级的变量。
因为最终的目标程序可能含有大量的全局变量,我们可以通过一个正则参数选择想查看的全局变量:
|
|
continue
执行下一个断点
|
|
next
或者 n
单步执行, =>
表示所运行的位置
|
|
locals
打印局部变量
|
|
break && condition
可以使用 break
和 condition
组合命令,在循环内部条件断点,例如下面这个操作
|
|
break main.go:6
根据行数设置一个断点,并且在i==7
时生效
condition 2 i==7
2的意思是设置断点的索引(第几个断点 根据"Breakpoint 2 set at 0x1058f24 for main.main() ./main.go:6" 可知是2)
locals 一下显示 slice = []int len: 6, cap: 8, […] i = 7
print
打印局部变量
|
|
stack
查看当前执行函数的栈帧信息:
|
|
goroutine or goroutines
goroutine 信息
|
|
调试服务
已知一个服务已经在运行,可以用dlv attach pid
来调试 ,例如
gameserver
是一个tcp
服务,监听8840
端口
|
|
查看gameserver
的pid
|
|
pid
是49913
|
|
至此就可以愉快的调试网络服务了,以客户端发送一个鉴权包作为了例子
例子
|
|
OnTraffic
有网络数据时回调的函数,这时候运行客户端,并且发送一个鉴权的数据包,客户端阻塞住了
dlv
这边执行continue
,可以看到=>
指向OnTraffic
,表示服务运行到这里了
|
|
netx
or n
单步运行
|
|
打印context
print context
|
|
print
这个命令非常强大,可以打印具体的字段,比如
|
|
设置另一个断点,然后continue
进入执行handler
的函数
|
|
中间过程和前面一样,直接跳到ClientAuth
函数,这是真正执行鉴权的逻辑
|
|
一步步运行
|
|
ctx.Bind(&req)
是将字节流映射到结构上,类似于gin context.Bind()
,打印req,会发现客户端发来两个字段
一个是被公钥加了密的密文二进制流CipherText
,一个是明文Text
其值为life is short
|
|
鉴权的逻辑也很简单,服务器用自己的私钥去解客户端发过来的密文,解出来的明文和客户端发的明文一样,说明鉴权成功,如果不一样则鉴权失败
鉴权成功后,会给Conn
写一个auth
的property
|
|
至此,一个鉴权的全部过程都详细debug
了
不得不说dlv
这个调试工具非常强大