调试器与GO
调试器 如果把调试器看成一个产品的时候,首先他应该具体的功能有哪些? 1. 断点 2. 代码与当前断点映射(例如查看源码) 3. 断点过后继续运行(继续执行,单步,单出) 4. 打印变量 附属的功能: 1. 打印调用栈 2. 打印堆栈 3. 函数调用 4. 条件断点 5. 反汇编 »
调试器 如果把调试器看成一个产品的时候,首先他应该具体的功能有哪些? 1. 断点 2. 代码与当前断点映射(例如查看源码) 3. 断点过后继续运行(继续执行,单步,单出) 4. 打印变量 附属的功能: 1. 打印调用栈 2. 打印堆栈 3. 函数调用 4. 条件断点 5. 反汇编 »
slice 对于slice来说,其实源码部分并不多,主要看一下make slice、growslice、slicecopy和copy 编译阶段 make slice语句跟map一样,在compile的typecheck阶段,将MAKE节点偷偷换成OMAKESLICE节点 关于oppend的代码实在/usr/local/go/src/cmd/compile/internal/gc/ssa.go的func (s *state) append( »
defer 这个话题有点大,只是翻阅了关键代码,细节太多了 主要defer要弄明白两个函数,函数目录在/usr/local/go/src/runtime/panic.go中的deferproc和deferreturn deferproc //主要这里面都不能使用栈分裂,不能进行逃逸分析,因为defer是希望利用栈内存处理 //go:nosplit func deferproc(siz int32, fn *funcval) { ... d »
NaN 之前阅读源码,发现golang的可比性和map里面都有NaN的特判 以前写js可知,NaN与任何浮点型比较都是false,包括它自己 // main.go package main import ( "fmt" "math" ) type TestFloat struct { Float64 float64 `json:"float64"` } func main() { mp := make(map[float64] »
序 关于map的实现,我按照我的思路来看源码,中间尝试了挺多的case,最终选了一些来作为实例 可能跟网上其他人不太一样 准备工作 首先做一些准备工作,跳过一下与编译无关的过程,例如搜索依赖关系 样例代码 新建临时目录test_map,在该目录下写入样例代码 // main.go package main import ( "fmt" ) func test_map() { s := make(map[ »
源码 今天调试了一下golang编译工具,发现了一个很有"奇怪"的地方 简化问题 假设有1000个任务,1000个并发协程,设置n(cpu核数)个物理处理器(task)并发完成,每个协程只要完成了当前任务采取完成下一个 代码 原始代码,go作者无所畏惧的使用协程 func parseFiles(filenames []string) uint { var noders []*noder // Limit »
一. 目录介绍 1._fixtures 这个文件夹下面主要放一些用于测试的应用程序源码 2.assets 存放了4个代表delve的图标 3.cmd 这个是server/client的命令行入口 主要从commands.go这个文件体现,主要使用spf13/cobra来做命令行工具(相信喜欢使用vim的人都应该听过spf13) 主要命令有debug、trace、attach等,但是这些命令核心都是在使用gobuild、execute,所以基本看这两个函数即可 gobuild 主要是对需要调试源码的进行编译 execute »
1. 问题 前几日,我在测试express框架的时候,构造了一个测试样例死活过不来,即便调试到测试框架superagent ,依然不对。最终发现是nodejs的bug,而且最新版本的nodejs已经"修复"了,导致我中间饶了几圈都没发现是nodejs的事,下面来重现问题流程。 2. 环境预备 安装一下gnvm 地址,后面需要控制一下版本(windows10 需要用管理员权限的cmd或者powershell) 安装git环境(主要要使用curl命令) 摘抄如下代码 // main.js var »