Mac M1原生(ARM64)Golang dev&debug
前言
通过本文最终实现了在M1芯片的Mac mini上的Goland的开发,并通过编译源码解决了无法DEBUG的问题。
Go 1.16版将正式支持Apple Silicon M1芯片,即arm64架构的Mac操作系统,目前go 1.16版版本为beta1,只是会在这个基础上再修修bug,改进文档等。
目前我测试M1 ARM64在编译性能上也超过了我的macbook pro 15的i9处理器,而且他还不发热,在晚上写代码的时候总能听到头上灯的电流声,太安静了有些不适应:)
本文软硬件环境:
设备:Mac Mini M1 8G/256G
Go版本: 1.15/1.16
final happy coding :) https://github.com/yoyofx/yoyogo
正文
目前有两种方式抢先体验Go1.16:
方式一:编译源代码
MacOS需要确保安装有 rosetta 2 (https://support.apple.com/en-us/HT211861)。
当然Mac上还需要安装一些工具链:如果MacOS在升级更新后会出现其它问题比如:xcrun: error: invalid active developer path, missing xcrun
同样使用下面命令可以解决:
xcode-select --install
sudo xcode-select -switch /
安装Go1.15,从1.4开发Go的编译器需要Go本身来编译Go,那么为了编译1.16,我们首先需要amd64版本的Go1.15。
mkdir $HOME/goroots
cd $HOME/goroots
wget https://dl.google.com/go/go1.15.6.darwin-amd64.tar.gz
tar xzf go1.15.6.darwin-amd64.tar.gz
获取Go的最新源代码,clone出来之后目前master分支便是 1.16 的预发布分支。
cd $HOME/goroots
git clone https://go.googlesource.com/go gosource
要编译go的话,需要先预编译 bootstrap 响应的工具链,这个工具链本身也是需要是arm64版,不然最后make出来的还会是x86。
cd $HOME/goroots/gosource/src
arch --x86_64 env GOROOT_BOOTSTRAP=$HOME/goroots/go GODEBUG=asyncpreemptoff=1 GOOS=darwin GOARCH=arm64 ./bootstrap.bash
注意上面的编译环境变量参数中有 GODEBUG=asyncpreemptoff=1 ,这是因为我们的go 1.15是amd64版,直接在m1 mac中运行时需要依赖 rosetta 2,而目前似乎rosetta 2对于go的协程异步抢占还有bug,因此需要关闭;否则编译时会死锁并出现错误:
rosetta error: ulock_wait failure: 105
完成这步后,我们便可在 $HOME/goroots/go-darwin-arm64-bootstrap 路径下获得编译完整go的arm64工具链。
最后一步编译arm64原生go
cd $HOME/goroots/gosource/src
arch --arm64e env GOROOT_BOOTSTRAP=$HOME/goroots/go-darwin-arm64-bootstrap ./make.bash
export PATH="$PATH:$HOME/goroots/gosource/bin/"
之后就可以正常使用了。
方式二:下载Go1.16beta1
https://golang.org/dl/go1.16beta1.darwin-arm64.pkg
下载安装后可以直接使用:
go version
go1.16beta1 darwin/arm64
开发工具
目前Goland正式版已经开发支持Mac M1的开发。
但是目前Goland的工具链还不能正常的进行DEBUG。
编译DEBUG delve工具链:
git clone https://github.com/oxisto/delve.git
git checkout -b darwin-arm64-lldb
cd delve/cmd/dlv/
go build
go install
cd $GOPATH
cp dlv/Applications/GoLand.app/Contents/plugins/go/lib/dlv/Mac/dlv
将delve进行arm64的编译后,覆盖Goland上的版本,就可以使用了。
ok ,如上我们终于又可以在M1上编写和调试我们的框架代码了 。
Mac M1原生(ARM64)Golang dev&debug的更多相关文章
- (转)打开Mac OSX原生的NTFS功能
xingchongsmbp3:~ xingchong$ xingchongsmbp3:~ xingchong$ xingchongsmbp3:~ xingchong$ sudo ln -s /Volu ...
- 2016年最新mac下vscode配置golang开发环境支持debug
网上目前还找不到完整的mac下golang环境配置支持,本人配置成功,现在整理分享出来. mac最好装下xcode,好像有依赖关系安装Homebrew打开终端窗口, 粘贴脚本执行/usr/bin/ru ...
- 打开Mac OSX原生的NTFS功能
插上磁盘 从finder或者使用以下命令查看到磁盘的Volume Name: diskutil list /dev/disk0 #: TYPE NAME SIZE IDENTIFIER 0: GUID ...
- golang remote debug和docker debug
在编写 Go 代码的时候,因为很多时候都是需要调试服务器上的代码的,作为一个年长的工程师,肯定不能用 log.Printf 来调试问题,所以我选择了 delve 这个工具,通过 delve 我可以像本 ...
- Mac OSX原生读写NTFS功能开启方法
macOX系统内建的NTFS支持默认只能读不能写 原生读写NTFS,需要自行终端命令手动开启 1. 插上磁盘 此时Mac桌面应该会显示出插入的磁盘,但是当你想把文件拖入磁盘的时候,发现是不能拖进去的, ...
- 【Golang】Debug :decoding dwarf section info at offset 0x0: too short
解决方法 通过下面的方式升级dlv 来解决这个问题: go get -u github.com/derekparker/delve/cmd/dlv 下面是我记录的定位问题的过程 问题描述 博主升级到了 ...
- mac 下配置 protobuf golang插件 并使用
介绍 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准Protocol Buffers 是一种轻便高效的结构化数据存储格式 可以用 ...
- chrome dev debug network 的timeline说明
在使用chrome的时候F12的开发者工具中有个network,其中对每个请求有个timeline的说明,当鼠标放上去会有下面的显示: 这里面的几个指标在说明在chrome使用文档有说明: 下面我用人 ...
- Mac打开原生NTFS功能
一.在 terminal 里输入 diskutil list 查看 U 盘的 NAME diskutil list 二.执行以下命令,输入密码 sudo nano /etc/fstab 三.把U盘信息 ...
- Mac下golang开发环境配置
go语言在开发效率和运行效率中的优势让很多人青睐,所以有倾向打算转向go语言的开发. 下面介绍在Mac OS X中golang的开发环境配置. 1.安装brew brew是一个mac下的由ruby开发 ...
随机推荐
- python selenuim使用代理的方式
一.FireFox浏览器 myProxy = "60.195.250.55:80" proxy = Proxy({ 'proxyType': ProxyType.MANUAL, ' ...
- ArrayList笔记
elementData是一个缓存数组,它通常会预留一些容量,等容量不足时再扩充容量,这个楼主一定是明白的,不用多解释.假如现在实际有了5个元素,而elementData的大小可能是10,那么在序列化时 ...
- cf493B Vasya and Wrestling
B. Vasya and Wrestling time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- chrome浏览器再次打开黑屏一段时间
打开chrome设置 最下面-显示高级设置 再拉到最下面-使用硬件加速模式(把勾去掉)
- SpringBoot集成Lombok,应用+源码解析,让代码优雅起来
一.Lombok简介 (1)Lombok官网(https://projectlombok.org/)对lombok的介绍 (2)GitHub项目地址:https://github.com/rzwits ...
- Flask Web中文教程
Flask Web中文教程:http://docs.jinkan.org/docs/flask/
- python 模块学习
一.from django.contrib.auth.hashers import make_password 通过函数名即可发现,主要有两个函数,分别是创建密码和验证 用法 ps = " ...
- 删除SQL注入的一些方法总结
sql替换法: ); set @myStr='oa_20121026new.bak</title><style>.alx2{position:absolute;clip:rec ...
- Codeigniter base_url() 返回的怎么是ip地址
本篇文章由:http://xinpure.com/codeigniter-base-url-to-return-what-is-an-ip-address/ 简单说说情况 虽然也是有一段时间没有用过 ...
- 使用Telegraf + Influxdb + Grafana 监控SQLserver服务器的运行状况
使用Telegraf + Influxdb + Grafana 监控SQLserver服务器的运行状况 前言 本文在Debian9下采用Docker的方式安装Telegraf + Influxdb + ...