一次解决Go编译问题的经过

news2024/11/29 12:46:06

图片

用Go语言编写了一个小的项目,项目开发环境是在本地的Windows环境中,一切单元测试和集成测试通过后,计划将项目部署到VPS服务器上自动运行,但在服务器上执行go run运行时,程序没有任何响应和回显,甚至main函数一开始的fmt.Println()都没有任何输出。

出现两个环境相同程序执行结果的不同,无外乎两类问题:配置问题和环境问题。

首先,检查了两个环境的Go语言配置和模块配置区别,包括Go语言版本差异(本地是1.22.4版本,服务器是1.23.0版本),并通过go clean -modcache和go mod tidy重新拉取了涉及的模块,发现问题依然存在。

其次,将程序中的几个单元测试文件单独执行,go test -v命令并没有任何输出,这意味着单元测试文件执行时候也有同样的问题,起初怀疑是和模块引用路径或程序中的路径或程序在Linux下的权限设置相关,但单元测试执行的问题排除了模块引用和路径问题,问题指向程序中数据库操作相关的函数。

因此,将主程序分步注释和执行,确定导致程序无响应的代码块,最终发现问题的根本在于:

import modernc.org/sqlite

这是一个操作SQLite数据库的第三方模块,是用Go语言编写,理论上是不存在环境兼容问题的。要查清楚问题的原因,需要单独编写一个程序验证该模块的问题,新的验证程序只引入了这个模块:

package main

import (
  "fmt"
  _ "modernc.org/sqlite"
)

func main() {
  fmt.Println("This is a test for sqlite")
}

通过go run单独执行该测试程序也出现相同现象,接下来通过go build-v手动编译检查模块引入过程中的问题,过程显示:

modernc.org/sqlite/lib: /usr/local/go/pkg/tool/linux_amd64/compile: signal: killed

编译过程到此结束,意味着sqlite模块在编译过程中编译进程被杀死,导致后续程序均无法执行,结合htop工具检查下编译过程中编译进程和系统资源的情况:

图片

进一步再用dmesg | grep -i ‘killed’,发现是由于Out of memory问题导致进程被杀死,和上图中的内存使用情况吻合(内存和Swap都满了),毕竟VPS服务器的内存有限,只有500Mb,Swap也只有265Mb。

问题的原因确定后,对应的解决思路就有两种:要么增加内存,要么在其他环境编译后移植可执行文件。

增加内存

由于内存本身有限,增加内存只能通过增加Swap解决,即在现有的/swap文件之外设置一个新的swap文件,并将新文件设置为新的swap。命令如下:

falloate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

另外,通过编辑/etc/fstab文件和添加下面命令,将新swap文件设置为系统启动时候自动加载的swap文件:

/swapfile swap swap defaults 0 0

完成以上配置之后,重新在测试代码目录下执行go build -v便可以完成编译过程,经过htop对于资源利用的观测,实际编译modernc.org/sqlite至少需要1G的内存。

交叉编译

交叉编译是在Windows系统上编译Linux系统运行的可执行文件,这样可以利用Windows系统的性能完成编译工作,直接在Linux系统上运行可执行文件。

进行交叉编译需要设定Go语言的环境变量GOOS和GOARCH,前者是系统类型,比如windows、linux,后者是架构类型,比如amd64、arm。笔者使用的两个环境都是amd64的64位系统,因此只需要设置系统类型:

go env -w GOOS=linux

之后再执行go build创建可执行文件,最后将可执行文件上传到VPS服务器执行即可。

洞源实验室
安全工程师:裴伟伟
2024 年 10 月 4 日 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2189124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有没有一款软件,可以在二楼电脑直接唤醒三楼的电脑?

前言 今天有个小姐姐找到我,咨询能不能在二楼的电脑直接访问到三楼电脑的资料。 这个肯定是可以的啊! 其实事情很简单,只需要弄好共享文件夹这个功能,只要手机、平板或者电脑在同个局域网下,就能访问到三楼电脑里的…

深入理解Dubbo源码核心原理-Part4

现在开始研究,消费端真正调用proxy的方法时,走的rpc调用 接下来就要走client,发送request请求了 Dubbo协议是怎样的呢? 具体每个字段什么含义请参照官网 链接:Dubbo协议头含义 编码器按照Dubbo协议来进行编码请求 Ne…

JVM内存回收机制

目录 1.JVM运行时数据区 2.JVM类加载过程 3.双清委派模型 4.垃圾回收机制(GC) 找出谁是垃圾方案一:引用计数 找出谁是垃圾:方案二,可达性分析 释放垃圾的内存空间 判断垃圾:jvm依据对象的年龄对 对象…

基于Zynq SDIO WiFi移植三(支持2.4/5G)

应用问题-WIFI作为AP-hostapd多次连接 设备作为WIFI热点时,连接出现了下述问题: 1 手机连接需要三次,三次都需要输入密码; 2 平板连接需要三次,三次都需要输入密码; 3 电脑连接需要一次,无感…

隧道人员定位UWB双通道定位终端

大家好,我是华星智控小智,今天我给大家介绍我们的UWB双通道定位终端。 双通道定位终端(型号STD)主要用于隧道人员或天车定位,终端基于无线脉冲技术,采用双天线设计,可实现对2路方向的测距定位&a…

实施威胁暴露管理、降低网络风险暴露的最佳实践

随着传统漏洞管理的发展,TEM 解决了因攻击面扩大和安全工具分散而产生的巨大风险。 主动式 TEM 方法优先考虑风险并与现有安全工具无缝集成,使组织能够在威胁被有效利用之前缓解威胁。 为什么威胁暴露管理 (TEM) 在现代网络安全策略中变得至关重要&…

使用模拟和真实的 Elasticsearch 来测试你的 Java 代码

作者:来自 Elastic Piotr Przybyl 在本文中,我们将介绍并解释两种使用 Elasticsearch 作为外部系统依赖项来测试软件的方法。我们将介绍使用模拟测试和集成测试的测试,展示它们之间的一些实际差异,并给出一些关于每种风格的提示。…

嵌入式C语言自我修养:编译链接

源文件生成可执行文件的过程? 源文件经过预处理、编译、汇编、链接生成一个可执行的目标文件。 编译器驱动程序,包括预处理器、编译器、汇编器和链接器。Linux用户可以调用GCC驱动程序来完成整个编译流程。 使用GCC驱动程序将示例程序从ASCII码源文件转换…

如何使用EventChannel

文章目录 1 知识回顾2 示例代码3 经验总结我们在上一章回中介绍了MethodChannel的使用方法,本章回中将介绍EventChannel的使用方法.闲话休提,让我们一起Talk Flutter吧。 1 知识回顾 我们在前面章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种…

仿RabbitMQ实现消息队列服务端(一)

文章目录 交换机数据管理队列数据管理绑定信息(交换机-队列)管理队列消息管理虚拟机管理交换机路由管理队列消费者/订阅者管理 整体框架:工具模块及项目整体模块框架 交换机数据管理 交换机数据管理就是描述了交换机应该有哪些数据 定义交换机数据类 1、交换机的名…

Linux忘记root用户密码怎么重设密码

直接说步骤: 1.重启客户机 2.在选择内核页面快速按e键,进入编辑模式 进入后应该是这个样子 在这里只能按上下键切换行 找到Linux16这里 3.按右方向键切换到行尾,也就是UTF-8处,在后面添加一个空格,然后加上这段话 …

鸿蒙网络管理模块04——网络连接管理

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。 1、概述 网络连接管理提供管理网络一些基础能力,包括WiFi/蜂窝/Etherne…

数据库概述(1)

课程主页:Guoliang Li Tsinghua 数据库在计算机系统中的位置 首先,数据库是在设计有大量数据存储需求的软件时必不可少可的基础。 最常见的是:我们通过app或者是浏览器来实现一些特定需求——比如转账、订车票。即引出背后的CS和BS两种网…

如何用深度神经网络预测潜在消费者

1. 模型架构 本项目采用的是DeepFM模型,其结构结合了FM(因子分解机)与深度神经网络(DNN),实现了低阶与高阶特征交互的有效建模。模型分为以下几层: 1.1 FM部分(因子分解机层&#…

Epoch、Batch与Iteration简答理解

揭秘神经网络训练的三大神秘要素:Epoch、Batch与Iteration 在探索深度学习的奇妙世界时,你是否曾被Epoch、Batch和Iteration这三个术语搞得晕头转向?别担心,今天我们就来揭开它们的神秘面纱,带你深入了解神经网络训练的奥秘! 一、Epoch:时间的轮回,数据的洗礼 Epoch…

Python | Leetcode Python题解之第454题四数相加II

题目: 题解: class Solution:def fourSumCount(self, A: List[int], B: List[int], C: List[int], D: List[int]) -> int:countAB collections.Counter(u v for u in A for v in B)ans 0for u in C:for v in D:if -u - v in countAB:ans countAB…

《深度学习》OpenCV 图像拼接 原理、参数解析、案例实现

目录 一、图像拼接 1、直接看案例 图1与图2展示: 合并完结果: 2、什么是图像拼接 3、图像拼接步骤 1)加载图像 2)特征点检测与描述 3)特征点匹配 4)图像配准 5)图像变换和拼接 6&am…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03目录1. A Scalable Data-Driven Framework for Systematic Analysis of SEC 10-K Filings Using Large Language Models摘要研…

centos72009源码编译R语言

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -Psparkr -Phive -Phive-thriftserver -Pmesos -Pyarn -Dhadoop.version3.4.0 -Pkubernetes spark3.5.3 源码版本 ./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -P…

有符号整型和无符号整型比较大小,整型提升{9.28下午}

有符号整型和无符号整型比较大小时,会先把有符号整型先转变成无符号整型 -1的补码是32个1,当成无符号整型来处理时,补码就是源码,所以是一个超级大的数 在C语言中,当有符号整型(如int)和无符号…