Go程序是如何执行的之上

一、搭建环境

在线上环境,我们都是用的Unix系统,但是在平时的开发过程中,我们可能用的是Mac。为了保持环境的统一,我们首先需要使用docker构建一个centos的容器,并在该容器上进行实验。

Dockerfile 复制代码
FROM centos

RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

RUN yum install golang -y \
&& yum install dlv -y \
&& yum install binutils -y \
&& yum install vim -y \
&& yum install gdb -y

构建镜像:docker build -t test .

运行容器:docker run -it --rm test bash

二、源码到可执行文件

本小节的目的:了解源码到可执行文件的整个过程。

首先,我们编译一个简单的hello.go文件,具体内容如下:

go 复制代码
package main

import "fmt"

func main() {
    fmt.Println("hello world")
}

我们想想,编译器与链接器根据程序员写的代码,将其翻译成可执行文件。

  • 首先,他两需要知道程序员写的源码是什么?有没有错误?是否能够被优化?
  • 其次,将其编译成底层汇编语言(中间文件)。
  • 最后,将多个中间文件链接为可执行文件。(软件系统也是如此啊。倡导组件化,像搭积木一样构建负责系统和这里出发点类似吧)

【注】作为应用开发人员,具体细节不用深究,需要的时候再详细了解即可

需要了解一下几个指令:

  • 获取编译详情:go build -x hello.go
  • 输出汇编代码:go tool compile -N -l -S hello.go
  • 反编译go tool objdump -S -s "main.main" hello

三、Dlv调试

本小节的目的:了解如何使用DLV以及利用DLV熟悉代码流程;

ReadELF获取程序入口地址

通过对可执行文件执行上述操作,可以获取可执行程序的入口地址;

DLV调试

下面所有的描述,都按照我们想做什么,然后执行什么指令的格式来描述;

  1. 我们想运行hello的可执行文件,所以执行dlv exec ./hello
  2. 我们想在RealELF文件Entry point address位置打断电,所以执行b *0x465760
  3. 我们想在调度函数schedule打断点,所以执行b schedule
  4. 我们想运行程序,执行c运行到第一个断点,再次运行cschedule
  5. 我们想查看此时的函数栈,执行stack,此时会打印函数栈;
  6. 我们想看看dlv还有哪些用法,执行h,查看介绍;

通过上述方法,我们知道Go函数的入口为runtime.rt0_go,在这个函数中:

  • runtime.newproc创建一个协程,并放在p.Next
  • runtime.schedule进行调用执行协程;

【注】创建协程放哪里,以及如何找可执行协程的后面再详细介绍

四:了解一下有用网站

参考

  • 草春晖《高级Go工程师》
  • Go语言底层原理剖析
  • Go语言设计与实现
相关推荐
Justin3go1 小时前
HUNT0 上线了——尽早发布,尽早发现
前端·后端·程序员
Tony Bai2 小时前
高并发后端:坚守 Go,还是拥抱 Rust?
开发语言·后端·golang·rust
一线大码3 小时前
SpringBoot 3 和 4 的版本新特性和升级要点
java·spring boot·后端
weixin_425023003 小时前
Spring Boot 配置文件优先级详解
spring boot·后端·python
weixin_425023003 小时前
Spring Boot 实用核心技巧汇总:日期格式化、线程管控、MCP服务、AOP进阶等
java·spring boot·后端
一线大码3 小时前
Java 8-25 各个版本新特性总结
java·后端
VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue校园社团管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
To Be Clean Coder4 小时前
【Spring源码】通过 Bean 工厂获取 Bean 的过程
java·后端·spring
weixin199701080164 小时前
闲鱼 item_get - 商品详情接口对接全攻略:从入门到精通
java·后端·spring
自己的九又四分之三站台6 小时前
导入数据到OG GraphQL以及创建graph
java·后端·graphql