美文网首页
GO语言汇编调试

GO语言汇编调试

作者: sanerersan | 来源:发表于2018-04-09 00:31 被阅读0次

阅读 bufio 源码的时候,对内置函数 len 产生了很大兴趣,想知道 len 函数的性能如果。

翻阅了 buildin.go,发现对内置函数的处理只有声明,没有定义部分。所以编译内置函数时编译器自动为其添加实现。

翻看了 go build -gcflags 的命令,找到以下比较有意思的参数:

-E debug symbol export

-N disable optimizations

-l disable inlining

-race enable race detector

把 -E -N -l参数加上后,能方便地通过汇编找到对应的 Go 语言代码。

编写一个简单的 go 程序:

package main

import "fmt" 

func main() {

    arr := [4]int{1, 2, 3, 4}

    i := len(arr)

    fmt.Println(i)

}

编译: go build -gcflags "-N -l -E" main.go

得到 main 文件,挂上 GDB,list 一下,能看到 go 源码:

(gdb) l

3 import "fmt"

4

5 func main() {

6 arr := [4]int{1, 2, 3, 4}

7 i := len(arr)

8 fmt.Println(i)

9 }

(gdb)

对 len 函数下断点,执行到相应位置。

之后执行 disasse(mble)就能看到相应汇编代码。

就当前的 len 函数,其实我们并没有看到相应的 call 命令,只能看到一系列的内存访问。

将 main 拖入到 IDA 中分析,可以看到如下内容:

mov rbx, [rsp+88h+a.len]

由此可以得出 len 函数直接实现为对结构体内部字段的访问,速度很快。

关于 GDB 调试汇编的其余内容,可以查看各类帮助文档和博客。

相关文章

  • GO语言汇编调试

    阅读 bufio 源码的时候,对内置函数 len 产生了很大兴趣,想知道 len 函数的性能如果。 翻阅了 bui...

  • go 的汇编代码

    plan9汇编 Go汇编语言实际上来源于plan9汇编语言,而plan9汇编语言最初来源于Go语言作者之一的Ken...

  • VS2019查看汇编代码

    必须有至少一个断点:调试 --> 窗口 --> 反汇编 C 语言、汇编同步学习

  • 使用Gdb

    基本语法 调试C程序 一段C代码 在gdb中我们通过disass main反汇编main函数 调试Go程序 一段G...

  • Shell

    一,Shell 是一种脚本语言 有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将...

  • Visual studio code 配置Golang环境

    ...To be updated 1 Visual Studio Code 2 配置VSC支持GO语言的调试 3 ...

  • Go语言interface实现原理详解

    1 前言 1.1 Go汇编  Go语言被定义为一门系统编程语言,与C语言一样通过编译器生成可直接运行的二进制文件。...

  • 使用 Delve 调试远程 Go 应用

    Delve[https://github.com/go-delve/delve] 是 Go 语言的一个调试器。其目...

  • go语言汇编(学习笔记)

    GO语言汇编:plan9(贝尔操作系统) go开发者与plan 9开发者同一人,Rob Pike 寄存器: 数据寄...

  • 原来go的接口内部实现是这样的

    1 前言 1.1 Go汇编 Go语言被定义为一门系统编程语言,与C语言一样通过编译器生成可直接运行的二进制文件。这...

网友评论

      本文标题:GO语言汇编调试

      本文链接:https://www.haomeiwen.com/subject/nnsvhftx.html