日常记录
文章平均质量分 85
主要分享日常工作中遇到的问题,或好用的知识
谢艺华
主要深耕于 linux 后端开发,热衷于体系能力(包括不限于C、C++、linux、编译原理、数据结构和算法、网络、操作系统
)的沉淀,分享工作中重要的知识点和具有代表性的案例分析。
欢迎志同道合的朋友与我一起前进
展开
-
【案例分析】解决困扰项目半年之久的问题,并让同事对我竖起了大拇指!!!
为了帮助您快速理解问题,我先向您简单介绍一下软件架构(架构以及基础件的设计非常不合理🤕,勿喷!!!我们采用多进程服务方式。不同类型的业务由不同的进程去实现。为了日志分析方便。后续决定将不同进程的log打印输入到同一个文件中。于是就产生了logRcv进程。它的作用就是通过读取共享内存中,来自其它业务线程的日志。将其写入统一的日志文件中。int tail;/** 1.获取共享内存锁*//** 2.将日志写入buf*/原创 2024-04-07 20:30:47 · 1156 阅读 · 0 评论 -
【案例分析】入职第一天,如何让同事对我刮目相看
确认是进程自己触发crash,还是系统触发。若是程序自己触发,可以通过打开系统的coredump属性,待生成core文件时,进行gdb分析。关于gdb的使用,可以参考我的文章【小白进阶】Linux 调试大法——gdb。(打开程序的调试选项-g和not strip若是系统触发,一般是因为触发了OOM机制。如果内存会随着时间逐步增加,一般就是存在内存泄漏了,最简便的方式就是使用valgrind工具,运行一段时间,查看内存泄漏点;若不是逐步增加,一般是因为某个操作导致的内存急剧增加。原创 2024-03-24 21:44:55 · 670 阅读 · 2 评论 -
案例分享:进程如何加载相同库的不同版本
本文分享了工作中的一个案例,由于历史原因。我们不得不在一个进程中采用两个不同的版本的相同算法库。识别到了潜在问题:符号重定义、全局符号介入、如何指定版本符号。并从理论与实践上分析解决。更深入了解运行时模块加载的好处与特殊场景。若我的内容对您有所帮助,还请关注我的公众号。不定期分享干活,剖析案例,也可以一起讨论分享。踩完您工作中的所有坑并分享给您,让你的工作无bug,人生尽是坦途。原创 2024-02-19 18:37:44 · 1145 阅读 · 0 评论 -
linux 防火墙介绍以及iptables的使用
在前几天,于工发现我们内部的150服务器7554端口被外网访问了。该应用提供着内部的摄像头资源。为了避免被入侵,于是我添加了一些iptables规则,防止外网的访问。iptables只是一个应用工具。通过对netfilter的介绍,我们知道linux的防火墙框架就是netfilter。但是它是处于内核空间的,我们无法直接去控制。而iptables就是应用层的工具。由于iptables内容较多,我这里主要通过几个例子来介绍。能够达到看懂命令,根据需求去搜索资料即可。//chain 指哪一条链。原创 2023-10-19 10:10:36 · 197 阅读 · 0 评论 -
基于openwrt创建应用程序教程
在内核模块定义中增加“SUBMENU”表示子菜单位置,在“$(INCLUDE)/kernel.mk”对内核模块定义了CATEGORY为kernel modules,所以内核模块在menuconfig中的主菜单为kernel modules,然后有下一级子菜单$(SUBMENU)。存放了一些脚本,使用了bash,Python,perf等多种脚本语言,编译过程中,用于第三方软件包管理的feeds文件也是在这个目录中当中,在编译过程中,使用的脚本也统一放在这个目录中。它的父目录为$(BUILD_DIR)。原创 2023-11-22 12:31:03 · 1192 阅读 · 0 评论 -
成长在于积累——https 认证失败的学习与思考
本周二长城项目在收尾过程中,出现了一个车端无法进行注册的问题:curl提示证书认证失败(其实已经能确认问题方向了,运维人员去确认证书问题即可)。还需要将客户端的公钥证书上传到服务端,服务端用自己的根证书进行验证,等双方都认证通过了,才开始进行数据传输。经过此事,我花了点时间,查阅网上资料,以及请问通知,总结了https 认证过程中的一些知识点。我用同样的根证书,客户端证书,客户端密钥,都是无法访问成功的(拒绝连接)。因此证书中一般包含以下信息:公钥,持有者信息,证书认证机构的CA信息,证书有效期等。原创 2023-11-21 18:28:07 · 1269 阅读 · 4 评论 -
细节决定成败——我的日志去哪了?
上图中,我们可以得出,UC的缓存文件以及日志都是在/dev/block/mmcblk0p23文件系统中。通过UE同事日志排查,界面卡住的原因是由于,重启后,UC反馈给UE 的状态机为downloading。以上仅是我当前提出的一种解决方案,相信肯定还存在一些遗漏,考虑不全面的地方,需要大家提出来,我们一起讨论。但是若再进一步思考,会发现本次问题的根因不是分区加载时序问题,而是分区加载后导致我们的。抱着这样的猜测,我在UC代码中添加了该判断:若mmcblk0p23分区未挂载成功,则睡眠10秒,尝试10次。原创 2023-11-21 18:19:41 · 95 阅读 · 0 评论 -
坑惨啦!!!——符号冲突案例分析
如上可知,我们遇到的问题并不是显示符号冲突,因为显示符号冲突是在编译阶段就已经确认,并且会一直存在。隐式符号冲突会导致程序运行时跳转到错误的符号,进而执行错误的代码段,最终造成错误。我们知道静态其实就是目标文件.o的集合体,只有当可执行程序需要时,才会从静态库中提取出相关依赖的.o文件,进行编译。,该参数告诉链接器,将该参数后面的共享库强制编译到目标文件中,即将共享库中的代码段,数据段强制加入到可执行程序中。通过以上分析,我觉得在项目中,我们可以从预防和解决两个方面规避符号冲,导致程序非预期情况。原创 2023-11-21 18:01:42 · 323 阅读 · 1 评论 -
【案例】由coredump引起的思考:程序的加载流程
小米项目的同事,最近遇到了一个crash问题,困扰较久,向我请求帮助。(其实是客户指定要求我来分析这个问题,该项目之前是由我负责的,帮客户解决很多较多crash问题。但是文件转移实例化对象,属于全局变量,之后在进程退出时,由系统进行回收。按照这个思路分析,怀疑是某个线程,调用了类似exit函数,导致系统默认为是进程正常退出。经验证,当下发任务后,会按照预期,调用exit(),之后进行资源回收,调用析构函数。我们知道正常的堆栈信息,调用栈的最上层接口一般是main函数,或子线程的入口接口。原创 2023-11-15 16:11:18 · 316 阅读 · 1 评论 -
flaot 数据类型的一些坑(大数吃小数)
首先我们来看一段代码,你认为它会输出什么呢?解析:逻辑上就是将1.0进行累加2千万次。我们预计的结果应该是20000000。但是结果却如图:毫无疑问,这肯定和float数据类型有关,但是至于为什么会出现这个问题,我们一起来分析。原创 2020-05-15 15:33:51 · 8600 阅读 · 3 评论 -
Makefile中常用函数
Makefile对于我们嵌入式工程师而言,并不陌生。其实它的语言并不困难,只不过在大型的工程中,使用了很多的隐含规则或者是函数,没有长时间的积累是不容易理解的。该文章主要是根据《跟我一起写Makefile - 陈皓》中的内容,记录我认为比较重要或者容易忽略的知识点,供初学者查阅学习。empty :=原创 2019-06-03 15:43:10 · 453 阅读 · 1 评论 -
arm(linux)下非对齐地址访问的问题
不管是什么架构,对要访问的一定长度的数据的地址是有要求的,比如要访问一个32位的整数,那么这个数据必须(最好)存储在以4字节(32/8=4)对齐的地方。就在这周,我在写串口命令的时候,遇到了一个很奇怪的现象,百思不得其解,刚开始以为是自己粗心,对于地址的偏移计算错误,但是经过自己长时间排查,甚至向同事请教,让他们帮我看一下代码逻辑,都没有发现什么异常。对于ARMv5的CPU,User faults的值默认是0,即忽略非对齐的地址访问,这时如果进程访问了非对齐的地址,就会导致程序执行异常。原创 2019-04-22 00:05:34 · 2695 阅读 · 1 评论 -
如何设计数据库表?
本章的主要目的就是想让大家了解数据库设计时需要注意的点。想要设计出一个优秀的数据库还需要更多的努力,在后面的学习中,如有相关的经验或总结,我会继续补充。即使我们现在还不是大牛,但是在工作中,如果让我们设计数据库,起码已经知道评判的方式,最起码要建立一个满足3NF的数据表。原创 2020-04-16 15:04:10 · 4592 阅读 · 2 评论 -
C语言中弱符号与弱引用的实际应用
在编码过程中,我们经常遇到符号重定义的错误。这就是符号重复定义导致的,再往细里面说,是在同一作用域内符号冲突。我们知道变量是由作用域和生命周期概念的。例1:main.cint main()return 0;strong.c则会报重定义错误。因为在main.c 和strong.c 文件中,整型变量strong是全局变量,它们的作用域都是跨文件的。若是在不同的作用域,即使相同变量名,也不会报错。原创 2021-09-17 14:57:06 · 922 阅读 · 3 评论 -
工作中如何编译开源工具(gdb)
编译是大部分工程师的烦恼,大家普遍喜欢去写业务代码。但我觉得基本的编译流程,我们还是需要掌握的,希望遇到相关问题,不要退缩,尝试去解决。天下文章一大抄,百度能解决我们90%的问题。原创 2021-08-26 20:56:16 · 2943 阅读 · 1 评论 -
数据落盘机制
我们知道想要将数据安全的写到磁盘,并不是一件容易的事情。他可能停留在用户层的缓冲区,也有可能停留在内核的缓冲区。因此,我们在编程中要有主动同步数据的良好习惯。原创 2020-09-12 11:03:58 · 6208 阅读 · 2 评论 -
如何将他人产品变为自己的产品?--包装方案
为了避免大家说我是标题党,先说明背景。前段时间,领导和我说了一个项目,需要开发一些无线设备。传输距离1500m左右带宽1000M问题就来了,在公司已有的资源下,是没有哪一款能够达到以上的性能。我很肯定的和领导说:“我们的设备性能达不到。如果要做的话,短期内做不出来的”。但是领导可不管,就说:“小谢,你想想办法,功能简单点也没关系。这个项目利润不错,你好好干,年底少不了奖金的”。听到奖金二字,我就有点激动,回复道:好好,我试试。时间短,重新画板子开发肯定不行了。于是我想到了包装方案。原创 2020-03-10 16:17:19 · 3205 阅读 · 3 评论 -
windows环境如何测试端口
背景由于疫情原因,被迫在家开始办公,那么远程办公如果需要公司中的资源就必须要进行端口映射,访问内部资源。(有些人可能是利用teamview等远程工进行远程办公)。我门使用的是windows自带的远程桌面应用mstsc。今天是开工第一天,当我连接领导给我配置的ip和端口是一直显示错误。如图:于是,我就觉得是他给的配置不正确。身为技术人员直接说你配置错了,没有充分的证据也不符合我的风格。分析...原创 2020-02-10 11:21:04 · 8122 阅读 · 0 评论 -
关于设备变砖的思考
关于设备变砖的思考背景前段时间同事在烧录软件时,在uboot模式下将imgaddr变量的值写成了8010000(正确值应该0x84000000),断电之后,设备就变砖了,无法启动。虽然知道他因为地址的原因,破坏了flash里面的数据,但是具体讨论起来,发现自己也不是很清楚,从讨论中,我也总结出了一些问题。该文章主要是解析这几个问题点。问题一:flash,RAM,ROM的区...原创 2019-07-08 10:33:30 · 1068 阅读 · 2 评论 -
OpenWrt make menuconfig 构建过程
OpenWrt make menuconfig 构建过程1.课题背景之前在《20190614 OpenWrt如何添加驱动以及应用程序 谢艺华-遗留问题解答》文档的问题7中,承诺要写一个关于make menuconfig的构架过程。于是就决定花点时间熟悉一下流程,方便以后的工作。2. 分析过程2.1 OpenWrt目录下的Makefile分析make menuconfig的过程也...原创 2019-06-25 15:01:52 · 3256 阅读 · 1 评论 -
virtual box如何使用同一个镜像文件建立多个虚拟机
最近因为工作需要,需要在virtual box中添加多个虚拟机,并且使用的是同一个镜像文件。为了各个虚拟机之间相互不影响,我总是会先拷贝一份,再新建一个虚拟机。这个过程中遇到了一些问题,再此纪录分享。原创 2019-06-12 18:39:36 · 8449 阅读 · 1 评论 -
关于重定向,看完你就懂了
例子对于不理解的同学,可以先直接运行一个demo,看看具体有什么区别,我们从结果来进行分析。#include<stdio.h>#include<fcntl.h>int main(){ printf("nihao \n"); perror("cuowu"); return 0;}之后进行编译,再测试:从结果我们可以看出,a.out > outf...原创 2019-09-04 11:56:04 · 2641 阅读 · 1 评论 -
在线升级内核版本
背景我们知道在很多的情况下,会多内核的版本进行要求。这时候就需要我们对内核的版本进行升级。最简单的方式就是重新安装一个内核版本的虚拟机。但是这种方式太过于繁琐,本章主要介绍两种在线升级的方式。查看内核版本uname -mrs输出如下:Linux 4.4.0-62-generic x86_64可知当前的内核版本为4.4.0,并且 CPU为X86架构64位。其中我们升级内核时,架构和位数不...原创 2019-10-09 10:49:50 · 1719 阅读 · 2 评论 -
双网卡-网络问题
同事在工作中出现了一个网络问题,其网络拓扑如下图:据同事的解决方式是:先把eno1和eno2两个网口拔掉,先插eno1,再插eno2。的确,这么操作之后,服务器就可以正常连接外网了,并且也可以通过外网访问服务器了。至于原因,还不是很清楚。通过排查,发现异常和正常情况下,服务器的路由表如下:异常路由表正常路由表其实通过对比,我们就知道大致问题了。很容易联想到网关的问题。原创 2019-10-10 14:50:10 · 3157 阅读 · 2 评论 -
lua 如何支持多线程操作?
栈的理解要向了解lua多线程,你就要知道栈的含义。这里我就直接摘录博客上的一些见解:栈就是一段特殊内存,什么是栈呢?举个例子,一个只有上面打开的盒子,现在有三本书离散数学、c语言、汇编语言,需要将这三本书一本一本的放进去,先将离散数学放进去,然后c语言,接着汇编语言,现在又需要将三本书拿出去,只能先拿汇编语言,再拿c语言接着再拿离散数学,栈就是这样的特点,后进先出。栈的大小...原创 2018-05-18 11:46:11 · 26130 阅读 · 3 评论 -
获取在线用户的hostname,ip,操作系统,制造商
通过以上两种方式。我们可以知道。方案一:需要更新的对应的表格,这样对后期的维护不方便方案二:不能确切的保证能够获取到相应的信息。且显示会不同步。现在很多的手机在第二次连接之后都会从request开始,如果不可以,再从discover开始。若我的内容对您有所帮助,还请关注我的公众号。不定期分享干活,剖析案例,也可以一起讨论分享。我的宗旨:踩完您工作中的所有坑并分享给您,让你的工作无bug,人生尽是坦途。原创 2018-05-18 11:43:45 · 1421 阅读 · 1 评论