本文基于 Go 1.13 和 gops 0.3.7.

gops 旨在帮助开发人员诊断 Go 流程并与之交互。它提供了跟踪运行中的程序几秒钟的功能,可以通过获取 CPU 配置文件 pprof,甚至可以直接与垃圾收集器进行交互。

发现

gops 提供发现服务,该服务能够列出计算机上运行的 Go 进程。gops 不带参数运行仅显示 Go 进程。为了举例说明,我启动了一个程序,该程序可以计算高达一百万的素数。这是流程发现的输出:

295 1 gops go1.13 /go/src/github.com/google/gops/gops

168 1 prime-number* go1.13 /go/prime-number/prime-number

gops 看到程序启动以及它自己的过程。基于此输出,我们唯一需要的是进程 ID 就可以开始与程序进行交互。但是,让我们了解 gops 是如何只过滤 Go 进程。

首先,gops 列出所有过程。然后,对于每个进程,它将打开二进制文件以读取其符号表:

如果符号表包含 runtime.main(主 goroutine 的入口)或 main.main(我们程序的入口),则可以将其标记为 Go 程序。

有关符号表的更多信息,建议您阅读我的文章 “Go:如何利用符号表”。要了解有关主 goroutine 的更多信息,建议您阅读我的文章 “ Go:g0,Special Goroutine”。

gops 也会通过之前的符号表里面的 runtime.buildVersion获取使用的 Go 版本。但是,由于可以从二进制文件中删除符号表,因此 gops 需要另一种方法来检测 Go 二进制文件。让我们用剥离后的二进制文件再试一次:

295 1 gops go1.13 /go/src/..../gops

168 1 prime-number-s* unknown Go version /go/.../prime-number-s

如果程序正确地标记为 Go 二进制文件,则由于缺少符号表,因此无法再检测 Go 版本。根据该可执行文件格式 - ELF,MZ 等 - gops 读取寻找嵌入在二进制版本 ID 的部分。一旦发现完成,它就可以开始与程序进行交互。

交互

与其他 Go 程序进行交互的唯一条件是确保它们启动了 gops 代理。该代理是一个简单的侦听器,将为 gops 请求提供服务。只需添加以下行即可:

if err:= agent.Listen(agent.Options {}); err!= nil {

log.Fatal(err)

}

然后,具有可用代理的任何程序都可以与 gops 进行交互。这是命令的示例 stats

# gops stats 168

goroutines: 6210

OS threads: 9

GOMAXPROCS: 2

num CPU: 2

有关更多命令,您可以参考项目文档。如果缺少该代理,则在与该代理进行交互时会收到错误消息:

Couldn't resolve addr or pid 168 to TCPAddress: couldn't get port for PID 168

该错误表明 gops 正在通过 TCP 寻找暴露的端点以便与程序进行通信。让我们画出软件包的工作流程以了解其工作原理。

工作流程

gops 与 Go 程序之间的通信是通过 TCP 和 Go 程序的暴露端点进行的:

分配给每个程序的端口都写在配置文件中,例如, path/to/config/{processID}可以很容易让 gops 知道暴露的端口。然后,gops 可以将命令标志发送到代理将在其中收集数据并进行响应的程序:

二进制包如何知道go 版本_gops 是怎么和 Go 的运行时进行交互的?相关推荐

  1. 二进制包如何知道go 版本_你有同时使用多版本 Go 语言的需求吗,那就快使用多版本管理利器 GVM 吧!...

    公众号关注 「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux ! Golang 发展迅速,代码迭代非常快,想要在同一环境调试和梳理不同项目进程就成了一件相对棘手的事情.二进制文件的管 ...

  2. 包区别 版本_详解Linux下二进制包、源代码包、rpm包区别与联系

    概述 有时去官网下载文件,因为很多格式,有时总会混淆,不知道哪个是需要的包,今天抽空做个总结,区别一下Linux的二进制包.源代码包.rpm包. 1.二进制包介绍(bin) 二进制包里面包括了已经经过 ...

  3. mysql 5.7自定义安装路径_Mysql5.7.18版本(二进制包安装)自定义安装路径教程详解...

    安装路径:/application/mysql-5.7.18 1.前期准备 mysql依赖 libaio yum install -y libaio 创建用户mysql,以该用户的身份执行mysql ...

  4. etcd 笔记(02)— etcd 安装(apt 或 yum 安装 、二进制包安装、Docker 安装 etcd、etcd 前端工具etcdkeeper)

    1. 使用 apt 或 yum 安装 etcd 命令如下: sudo apt-get install etcd 或者 sudo yum install etcd 这样安装的缺点是:安装的 etcd 版 ...

  5. Linux-什么是二进制包,源码包,RPM包,软件仓库

    博文说明[前言]: 本文将通过个人口吻介绍什么是二进制包,RPM包,源码RPM包(SRPM包),源码包,以及RPM常用命令,源码rpm的安装(*.src.rpm),源码包的安装步骤知识(./confi ...

  6. php for windows二进制包,PHP5ForWindowsVC9-x865.4.3安装版

    PHP 是一种新型的 CGI 程序编写语言,易学易用,运行速度快,可以方便快捷地编写出功能强大,运行速度快,并可同时运行于 Windows.Unix.Linux 平台的Web后台程序,内置了对文件上传 ...

  7. linux下软件包管理-源码包-二进制包

    linux软件包管理   1.软件包分类     源码包     二进制包(rpm包)      2.rpm包命名规则       命名规则:         name-major-minjor-re ...

  8. MariaDB的二进制包安装方法

    软件包的安装方式有三种:源码包安装.二进制包安装.rpm包安装.这三种安装方法都各有优劣.RPM安装:适合小环境,核心功能都具备,快速搭建环境,但它的版本一般都不会太高:二进制安装:它是发布出来时预先 ...

  9. Linux下二进制包、源代码包、rpm.binary与rpm.source

    要提供三种格式的mysql包:rpm格式.二进制格式.源码格式:(tar打包,gz压缩) rpm格式: libjpeg-devel-6b-33.x86_64.rpm       #rpm格式很好区分, ...

最新文章

  1. C++中引用()的用法和举例说明
  2. 饿了么监控体系:从架构的减法中演进而来
  3. ssh_exchange_identification: Connection closed by remote host 问题的解决 (转)
  4. 关于Dictionary元素的遍历
  5. 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器
  6. 如何在Linux(CentOS, Debian, Fedora和Ubuntu)上安装MyCLI
  7. nginx+lua+redis 灰度发布实现方案
  8. js二进制流转Blob对象。Blob对象再转File对象
  9. 互联网的的一些历史资料收集
  10. 获取手机IMEI和UID
  11. Git分布式版本控制
  12. Android系统源码分析--Context
  13. php json对象转为字符串,JSON对象转化为字符串(附上代码详细解答)
  14. 2020-03-31
  15. Vscode tab键使用
  16. curl和gopher协议(ssrf的利用)
  17. 三国时期蜀国的巅峰实力
  18. 《k3s 源码解析3 ---- k3s集群搭建》
  19. spin_lock到spin_lock_irqsave的使用
  20. MySql的初识感悟,以及sql语句中的DDL和DML和DQL的基本语法

热门文章

  1. php控制器教程,laravel基础教程 -- 控制器
  2. python email模块详解_python模块之email: 电子邮件编码解码 (一、解码邮件)
  3. ap计算机科学a买什么书,准备AP*计算机科学A考试-第1部分
  4. 综合素质计算机考点,教师资格证小学综合素质考点及考试真题:信息处理能力...
  5. java读取gpx文件,从Leaflet导出GPX文件
  6. xwpftablecell设置字体样式_HTML的文字样式
  7. ctypes python_[python学习之路]ctypes,Python
  8. 【Java】synchronized关键字笔记
  9. mysql gtid 还是pxc_记一次 PXC 集群拆分引发的思考
  10. Razor Generator