undefined symbol 可能的问题
备忘录
这里尤为重要,通常情况下是没有时间去看那么多的基础知识的,就只需要哪几个命令管用拿来用就好了。
有时候构建项目会遇到一些undeined symbol这样的错误。这里备忘一下用到命令和排错方式。
ldd [.so/.a/bin] # 查看link 的lib库有哪些( T 表示加载, U表示undefined symbol)
strings [.so/.a/bin] # 打印出二进制中的string,有时候可以用来看.so的version
objdump # 用来查看目标文件的构成,除非你懂目标文件的构成(section)那些不然一般用不上
nm # 显示目标文件中的符号,意味着可以看到一些全局变量之类的) 这个具体的说明看这个博客https://blog.csdn.net/K346K346/article/details/89088542
大致就是看代码,symbol是存放在哪个lib里的,然后用ldd看这个lib的位置,然后看一下时间戳和version 是不是正确的。
如果lib是自己项目编译出来的呢?
那么就是到编译目录下(build/)下面找.o文件,用obj ...
开箱即用的开发环境
每次安装部署开发环境都很折腾。不是这个依赖就是那个依赖,然后基开发资源如果有限的话就更头疼,有没有可能有开箱即用的开发环境呢。可以让新人一来项目,部署环境就像安装个exe文件那么简单。
rsync+inotifywait +wsl2
主要还是因为公用资源有限,代码解析速度很慢。
用wsl同步代码的理由
服务器资源有限,但是办公电脑的配置很高,可以用办公电脑来做这件事
只是在本地生成compile_commands.json和运行clangd服务器,并不需要很多依赖
谈谈rsync事情起因是因为服务器配置有限,没那么好用。就用inotifywait来监听文件变化,然后触发rsync进行增量同步。rsync的增量同步大致就是在执行初期,remote会将每个dest文件的rolling checksum和checksum 组成列表发给local机器。本地机器将需要同步的文件分成多个chunk,每个chunk有对应的check sum和rolling checksum。这些chunk以rolling checksum 为key,存入hash table中。如果有哈希碰撞就在后面用数组链 ...
漫谈VCS在游戏中的使用
漫谈VCS在游戏中的使用
VCS(版本控制系统)
基本上大家耳熟能详的就是git和svn这两个。前者是基于分支做管理的,后者是用目录来进行版本管理。从使用上来说,代码更友好的是Git,但是对于游戏项目来说很多都是用SVN,更好管理文件资源。
最近还用到一个叫Perforce(P4V)的商业VCS软件,也很不错。网上各种VCS资料已经很多了,这里着重讲讲不同的VCS使用上的体验和个人主观臆断的想法。
切版本的资源开销Git 每次的开销上,对于一些非文本的文件,例如图像资源、二进制等Git在做分支管理的时候就是会比SVN更慢一些。因为我理解的Git 在每次切换分支的时候,是经过了本地的Git Tree来比对不同分支下的差异,然后根据这些差异来重放的,也就是说Git只存每次提交Diff的内容。但是对于二进制或者是非简单文本内容来说(例如xlsx),Git就没办法分析出Diff内容了,也就是退化到存文件本身。
SVN这个是用目录来管理的,就好像不同目录下有不同版本的资源。Git是用分支来隔离,SVN就是用目录了。只要把所有目录都拉下来其实就不存在切换版本的开销了,毕竟换个目录就可以。但是如果 ...
关于通过cp覆盖so导致coredump
| 这个问题的起因是在讨论别人热更方案的过程中发现用cp替换so会出现coredump的问题,这里转载一部分网上的文章同时自己做一个补充。后续补充服务器热更的一些文章吧(如果有时间的话:)
一、为何cp覆盖进程的动态库(so)会导致coredump?先说结论:
1.应用程序通过```dlopen`` 函数打开so的时候,kernel通过mmap把so加载到进程地址空间,其对应于虚拟内存空间(vma)里的几个page.
2.在这个so加载过程中loader会把so里面引用的外部符号例如malloc、printf等外部函数解析成真正的虚存地址。
3.当so被cp覆盖时,确切地说是被trunc(trunc标志会先清空文件内容后打开)时,kernel会把so文件在虚拟内存的页清除掉。
4.当运行到so里面的代码时,因为虚拟内存的页已经清除掉了,这时会产生一次缺页中断。
5.缺页中断会导致Kernel从so文件中拷贝对应的页到内存中去,这时候问题出现了:
a) 如果so里面依赖了外部符号,但是这时的外部符号并没有经过重新解析,kernel只是简单的将我so文件中对应的页拷贝到内存中,当调用 ...
Kubernetes学习笔记0-从零搭建k8s集群
先从实践开始吧这是一个比较烧钱的方法, 我直接在腾讯云上开了两台双核4G的centos服务器。 (只要设置服务器是双核4G,非大陆地区的网络,其他默认即可,怎么便宜怎么来)
网上有很多是虚拟机的,因为某些原因不方便用虚拟机的网络,同时因为可以白嫖腾讯云的服务器,就直接买了两台~
下面参考博文中也有虚拟机配置集群的教程,没有试过,看着挺靠谱的样子~
在这里建议,买服务器如果是为了编程,强烈建议买国外的节点,很多镜像源都不用配置了,对于开发来说实在太友好了!当然访问速度也很差,如果有梯子就另当别论了,梯子相关的教程也在我的博客里,大家可以找一下。
配置: 双核(必须,没有双核就装不了)
搭建harbor教程: (这个只是个镜像仓库,也可以不装。) https://zhuanlan.zhihu.com/p/31483386
公共配置(所有机器都要安装的)(可选)一键服务器环境脚本(这是我比较喜欢的环境配置,大家酌情使用)只是简单的安装了zsh和vim的配置
sudo yum install git -y
sudo yum install zsh -y
git clone https://g ...
Kubernetes学习笔记1-容器编排
Kubernetes中的进程组—PodDeployment ——ReplicaSet —— 版本控制容器状态的好助手 —— StatefulSet容器化守护进程—— DaemonSetDaemonSet的作用就是在每一个节点里运行一个Daemon Pod,它会在节点加入集群后自动的创建出来,生命周期是跟随节点的。更重要的是,跟其他编排对象不一样,DaemonSet 开始运行的时机,很多时候比整个 Kubernetes 集群出现的时机都要早。
Docker深入理解
| 知识来自于极客时间 张磊老师的《深入剖析Kubernetes》,这里是作为学习笔记存放。
Docker 深入理解虚拟机与容器以前,想要搭建一个开发环境或者是博客,就需要找一篇教程,按部就班的一步步走下来。后来我想能不能把整个系统打包下来,每次到新的电脑上,直接下载这个系统装上去就行了。如果真的打包一个系统肯定不可能,那么打包一个虚拟机还是很容易的。
虚拟机本身就是模拟出一整套的硬件和系统,可以说虚拟机里的所作所为与宿主机没有任何关系。缺点就是性能消耗太大了,要知道,在一个操作系统上跑一个另外一个完整的操作系统这件事本身就占据了极大的资源开支,更别说还需要在虚拟机上运行程序。常见的虚拟机有VMware。
如果说要把虚拟机的所有内容打包下来给别人使用,这个压缩包也太大了。起码5G以上。有没有什么办法可以尽可能的减少一些我不需要的内容呢? 比如像操作系统这样的我就是不想需要的,因为我能运行开发环境或者博客,肯定已经有了操作系统了。
Docker 容器应运而生。容器技术本身就是通过操作系统的隔离(namespace)做出了一个完整的rootfs文件系统,里面包含了应用程序所需要的依赖,对于 ...
关于CI/CD 持续部署、交付的一些想法吧
关于CI/CD 持续部署、交付的一些想法吧不得不说,这两样东西大大的节约了我博客部署的时间,以前我需要频繁的
hexo cleann
hexo g
hexo d
才可以部署上我的博客。最糟糕的时候就是我转换到一个新的电脑/开发环境,想要写点博客内容,如果博客源程序没有在github上的话就没办法开始写作,即使是在GitHub上的话也要经过提交,之后再敲入上面的三个命令才可以上传一篇新的文章在我博客上。
时代变了,大人现在用上了CI/CD,来到一个崭新的电脑上,我仅仅需要git clone 然后写文章,最后提交就可以部署好所有的东西了,背后的GitAction会自动化的执行脚本,将博客清理缓存,然后生成文章,最后部署到实际的托管网站上。
在我看来,CI/CD就是类似于流水线一样,把原来的一系列操作缩影成脚本一样的东西,程序员只要提交上去流水线程序会自动的将后面需要执行的操作自动化的执行完成,中间如果出现故障的话就会终止。 当然,这一系列自动化动作的起点就是需要一个明确的动作来触发流水线执行,在我这边的例子就是感知到当前Git仓库有新的提交,就会触发流水线重新构造。还没有仔细看Gi ...
2021-5-14 晴. 重新连接
阔别一年,重新开始写博客大概从去年开始实习之后就很少有时间写博客了。主要是因为本来博客从typecho迁移到hexo这个过程是在公司里面做的,离职的时候忘记把源码带走了,只留下生成后的网页,一年多以来的心血差点化为乌有。还好有vultr的快照在,回去之后重新买了一小时的服务器(vultr真好啊,按小时计费),把数据库给download下来,再用工具转换为Markdown格式的。实际上这个过程我断断续续花了近半年,倒不是很难,主要还是自己太懒了。其实2020下半年大部分都还是在摸鱼,把项目做完后休息了快半年了。经常有想法写博客,把这半年来的技术积累记录下来,但是看到博客源码都没了,实在提不起笔,也能体会到雷军大佬代码被删了之后专心做产品经理的心情了,或许有些许相似。
还好,我还是比较幸运的,有备份。 为什么这么久才开始写博客呢? 其实每次一想到自己的博客网站,都不禁联系到小时候杂草丛生的破旧学校,很是心疼,但是也仅仅是想法上而已,哈哈哈哈。
不过刚好一年咯,终于还是把博客重新整了一遍。参考了一个前端大佬的博客,用在github和coding双线部署,在dnspod里把线路解析为境内和境外 ...
容器相关名词解释
容器相关名词解释Helm 和 ChartHelm 是一个 Kubernetes 应用的包管理工具,用来管理 chart——预先配置好的安装包资源,有点类似于 Ubuntu 的 APT 和 CentOS 中的 YUM。2019 年 11 月 13 日,Helm 3 发布,2020 年 4 月 30 日,从 CNCF 中毕业。本文基于 Helm 3。
Helm chart 是用来封装 Kubernetes 原生应用程序的 YAML 文件,可以在你部署应用的时候自定义应用程序的一些 metadata,便与应用程序的分发。
Helm 和 chart 的主要作用是:
应用程序封装
版本管理
依赖检查
便于应用程序分发
下面是 Helm 的架构图。
Helm 可以安装本地或者远程的 chart,当 chart 安装到 Kubernetes 中后就会创建一个 release,每次更新该 chart 的配置并执行 helm upgrade, release 的版本数就会加 1。同一个 chart 可以部署多次。
安装 Helm前提要求
Kubernetes 1.5 以上版本
执行 helm 命 ...
C++后台开发环境部署
C++ 后台开发环境部署
记录C++ 后台开发环境的部署,包括但不限于代码补全,编译等。
大致方案就是VScode+ Clang来进行代码补全的,编译直接就上服务器编译就好了。不过本方案也仅限于用Cmake的项目,其他的没试过
有一台自己的服务器(:
下载VScode,安装插件。
配置服务器的SSH。
在服务器上安装clang
在VScode上安装clangd插件和clang-format插件
Git 使用笔记
Git使用GIT
git stash :暂存当前变更
git stash pop : 恢复变更
git checkout 分支 : 切换到分支
git pull :更新到最新
git add 文件:加入追踪
git checkout -b 新分支 : 在当前分支上创建新分支
git commit -m “–story=863210137 【紧急发布】mq_proxy优化” :提交
git push : 推送
git push –set-upstream origin KiHan36Month3Week1Pub_MqProxy 设置远端上游分支
git fetch origin 分支名 切换到远程分支名下
git rebase 分支: 改变基节点为[分支]的HEAD节点。
Rebase假设我们从master上签出新的分支dev1,在我们开发dev1分支的时候master上也不断有新的提交、合并分支。如果想merge 到master上的话会有新的merge记录。但是如果是用rebase就没有。因为rebase操作就是从master上重新签出一个新的临时分支,将dev1上的所有提交(从他签 ...