我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

go语言汇编后,go 汇编

bpftrace动态追踪golang应用-函数内联问题

在上一篇文章的golang代码中,函数add的上一行,增加了一条注释语句: //go:noinline 。在bpftrace追踪时,是否可以去掉?有什么作用?

千山网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站开发等网站项目制作,到程序开发,运营维护。创新互联公司公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司

为了说明该问题,设计一个例子。

golang代码中,有两个求和函数。其中,add1加上 //go:noinline ,另一个add2不加。代码如下:

bpftrace程序分别对函数add1和add2的输入参数、返回值进行追踪,代码如下:

执行程序后,可以看到bpftrace程序能够正常追踪到函数add1,但是无法追踪到函数add2。

通过上文中的示例代码,可以看到,没有加 //go:noinline 的函数无法被bpftrace程序追踪到。通过查阅golang相关文档,可以知道, //go:noinline 表示该函数在编译时,不会被内联。

使用 objump -S 生成golang程序的汇编代码如下:

通过汇编代码,我们可以看到,主函数中,地址 0x498e52 处 callq 498e00 调用了add1函数,地址 0x498ebb 处 movq $0x4,(%rsp) 直接计算求值。

因此,golang编译器在编译代码时,会对代码进行分析,并按照内联规则,将某些函数生成内联代码。一旦函数被内联,bpftrace将无法追踪到对应函数。也就是,上文中函数 add2 无法被追踪到。

针对golang程序中编译器内联的问题,可以通过禁止内联的方式来解决。禁止内联的方式有:

在实践中,可以通过 go build -gcflags="-m -m" 来查看,哪些函数会在编译时执行内联,如:

从输出中,可以看到:

关于golang编译器进行内联的场景,可以参考golang源码:。

由于golang编译器内联优化,bpftrace可能无法正常追踪golang程序。在编写bpftrace脚本时,可以先使用 nm 命令查看一下可执行程序,是否存在需要追踪的函数的符号信息。如果没有则bpftrace将不能对其进行追踪。

前面的示例中,都是对 int 类型的参数进行追踪,那对于 string 类型的参数,是否也可以用同样的方式进行追踪?将在下一篇中进行讨论。

go语言用LiteIDEX16编译后在win8命令提示符中运行乱码该怎样解决?

可能是编码的问题吧,go语言默认用utf8编码,而windows的命令行程序可能用的是gbk,

用go语言编写的程序会被谷歌监控到吗?

不会,你想多了。所有程序归于汇编,汇编归于机器码,写个hello world的程序,其汇编和机器码藏不住监控程序的。

再加上用的人多,网络方面编程人员会从网络传输把关,系统方面编程人员会从系统占用率把关,以及其他各种从业人员。

别想太多,估计问这个问题也不是从业人员吧

Go语言的开源项目

1.Docker项目

网址为 。

介绍:Docker是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker可以在一台物理服务器上快速运行一个或多个实例。例如,启动一个Cent OS操作系统,并在其内部命令行执行指令后结束,整个过程就像自己在操作系统一样高效。

2.golang项目

网址为 。

介绍:Go语言的早期源码使用C语言和汇编语言写成。从Go 1.5版本自举后,完全使用Go语言自身进行编写。Go语言的源码对了解Go语言的底层调度有极大的参考意义,建议希望对Go语言有深入了解的读者读一读。

3.Kubernetes项目

网址为 。

介绍:Google公司开发的构建于Docker之上的容器调度服务,用户可以通过Kubernetes集群进行云端容器集群管理。

4.etcd项目

网址为 。

介绍:一款分布式、可靠的KV存储系统,可以快速进行云配置。

5.beego项目

网址为 。

介绍:beego是一个类似Python的Tornado框架,采用了RESTFul的设计思路,使用Go语言编写的一个极轻量级、高可伸缩性和高性能的Web应用框架。

6.martini项目

网址为 。

介绍:一款快速构建模块化的Web应用的Web框架。

7.codis项目

网址为 Labs/codis。

介绍:国产的优秀分布式Redis解决方案。

8.delve项目

网址为 。

介绍:Go语言强大的调试器,被很多集成环境和编辑器整合。


新闻标题:go语言汇编后,go 汇编
本文URL:http://shouzuofang.com/article/phiepd.html

其他资讯