go语言调试 go语言调试框查找( 三 )


在我们开始前,需要确保核心转储的ulimit设置在合适的范围 。它的缺省值是0,意味着最大的核心文件大小是0 。我通常在我的开发机器上将它设置成unlimited 。使用以下命令:
接下来,你需要在你的机器上安装 delve。
下面我们使用的 main.go 文件 。它注册了一个简单的请求处理函数(handler)然后启动了HTTP服务 。
让我们编译并生产二进制文件 。
现在让我们假设,这个服务器出了些问题,但是我们并不是很确定问题的根源 。你可能已经在程序里加了很多辅助信息,但还是无法从这些调试信息中找出线索 。通常在这种情况下,当前进程的快照会非常有用 。我们可以用这个快照深入查看程序的当前状态 。
有几个方式来获取核心文件 。你可能已经熟悉了奔溃转储(crash dumps) 。它们是在一个程序奔溃的时候写入磁盘的核心转储 。Go语言在缺省设置下不会生产奔溃转储 。但是当你把 GOTRACEBACK 环境变量设置成“crash” , 你就可以用 Ctrl+backslash 才触发奔溃转储 。如下图所示:
上面的操作会使程序终止 , 将堆栈跟踪(stack trace)打印出来,并把核心转储文件写入磁盘 。
另外个方法可以从一个运行的程序获得核心转储而不需要终止相应的进程 。gcore 可以生产核心文件而无需使运行中的程序退出 。
根据上面的操作,我们获得了转储而没有终止对应的进程 。下一步就是把核心文件加载进delve并开始分析 。
差不多就这些 。delve的常用操作都可以使用 。你可以backtrace,list,查看变量等等 。有些功能不可用因为我们使用的核心转储是一个快照而不是正在运行的进程 。但是程序执行路径和状态全部可以访问 。
Go语言编译成aar并调试 go及gomobile的环境配置这里就不介绍了,直接说aar的生成和使用 。
1. 设置环境变量GOPATH
GOPATH的值可以有多个 , 用半角分号间隔,但不能以其结束,设置完成后需要重新做 gomobile init。
2. 在GOPATH里创建src文件夹,用于存放go的包和源文件
3. 在src中创建hello文件夹(go文件的包名)
4. 在hello中创建hello.go文件,并输入内容
5. 编译
执行命令: gomobile bind -target=android hello
会生成一个hello.aar文件
6. 导入到android工程
将hello.aar文件放入工程的libs中 , 并配置build.gradle
在根结点加入:
在dependencies结点下加入依赖:
7. 在Java中测试
运行后 , 结果会输出 Hello, Android and Gopher
GO语言学习系列八——GO函数(func)的声明与使用 GO是编译性语言,所以函数的顺序是无关紧要的,为了方便阅读,建议入口函数 main 写在最前面,其余函数按照功能需要进行排列
GO的函数 不支持嵌套,重载和默认参数
GO的函数 支持 无需声明变量,可变长度,多返回值,匿名,闭包等
GO的函数用 func 来声明 , 且左大括号 { 不能另起一行
一个简单的示例:
输出为:
【go语言调试 go语言调试框查找】 参数:可以传0个或多个值来供自己用
返回:通过用 return来进行返回
输出为:
上面就是一个典型的多参数传递与多返回值
对例子的说明:
按值传递:是对某个变量进行复制,不能更改原变量的值
引用传递:相当于按指针传递,可以同时改变原来的值,并且消耗的内存会更少,只有4或8个字节的消耗
在上例中,返回值 (d int, e int, f int) { 是进行了命名,如果不想命名可以写成 (int,int,int){ ,返回的结果都是一样的 , 但要注意:

推荐阅读