跳到主要内容

VIM、SVN基本使用

· 阅读需 3 分钟

vim、svn 在我的认知里,感觉都是上古时代的产物了。但是公司还是有用 SVN 管理的项目,也没有谁有动力去升级一下。VSCode 对SVN的支持可以说基本没有,连本地代码差异对比都不支持。没有办法,就只能自己记录一下这两个上古工具大致是怎么使用的了。

VIM

~/.vimrc
"显示行号
set number

SVN

拉取代码(将http://172.16.0.252/svn/DanKiV5/branches/B023_BJ_ALG拉取至B023_BJ_ALG 目录下):

svn checkout http://172.16.0.252/svn/DanKiV5/branches/B023_BJ_ALG B023_BJ_ALG

查看工作区状态

svn status

unRaid被植入挖矿程序

· 阅读需 4 分钟

没想到我的unRaid居然被植入了xmrig挖矿程序。

今天突然听到 NAS 机箱内的风扇在狂转,当时想着现在好像也没让它干啥活,怎么会这么响呢。当时执行了一下 htop 命令,发现 unRaid 里面居然在偷跑挖矿程序 XMRig

29587 root        20   0 2404M  276M     8 S   0.7  0.9 30:00.95 /tmp/test/xmrig --config=/tmp/test/config_background.json

Git使用遇到的问题

· 阅读需 5 分钟
amass
一个正在躺平的板砖人

解决Git提交冲突问题

每次我在写完代码,要向服务器提交时,经常会忘记提交前确认自己或其他同时是否提交过,而直接执行提交。如果之前确实有人提交,而我又没有同步,那么就会出现如下报错:

关于Linux桌面环境

· 阅读需 2 分钟

这几天没事,又想在 NAS 上使用 docker 构建能够通过 xrdp 访问桌面环境的 ubuntu 镜像容器。一番折腾下来,发现还是很麻烦,自己一时半会也折腾不清,感觉去琢磨,去看别人的 Dockerfile 构建脚本也很花费时间。

刚刚回过头来一想,还是不折腾了吧。有个 Windows 虚拟机就够了,Linux 的桌面环境使用体验感本来就不好,何必呢。

顺便想到把自己不常使用的笔记本带到公司去,然后把公司的台式电脑重装 Linux Mint,这个使用VS Code 经由 SSH 远程开发,使用上应该会比 WSL 体验要好,WSL 经常会莫名奇妙占用大量的 CPU 和内存。

如果偶尔用下 Linux 桌面环境,可以安装 xrdp,通过 Windows 远程桌面访问,也挺好的。

好了,仅记录告诉自己以后不要再折腾这个无聊的事情了。

U-Boot烧录固件

· 阅读需 2 分钟

今天在折腾设备时,替换了设备内的 libc.so.6 导致设备无法开机了,只能进入U-Boot。目前目前又无法使用 RKDevTool 烧录工具那样的傻瓜式通过USB进行烧录。

跟同事询问之后,可以使用U-Boot将文件系统写入到emmc中。 首先先配置好网络相关的U-Boot环境变量:

Linux嵌入式查找内存泄漏

· 阅读需 9 分钟

LeakTracer

LeakTracer 是一个非常轻巧的内存泄露排查库。基本所有的内存泄露排查工具原理都一样,记录内存申请的现场信息,在内存释放处,将配对的现场记录删除掉。然后在程序结束或某个时间,打印出那些还尚未被移除的现场记录。

有时候有些程序,运行后,无法手动结束应用,即代码编写并不规范,没有考虑程序结束的处理情况。在使用 LeakTracer 的时候,可以选择带程序初始化完成延后一段时间,再开始记录内存申请释放。然后周期性的打印输出,查看是哪个位置内存泄漏可疑性非常大。

leaktracer_startMonitoringAllThreads();
while (!exit) {
std::this_thread::sleep_for(std::chrono::minutes(5)); // 这里最好可以更加细片化判断exit,以方便线程退出
leaktracer_writeLeaksToFile("leak_hhmmss.dump"); // 建议文件名添加时间戳便于分析和防止文件发生覆盖
}
leaktracer_stopAllMonitoring();

生成的 leak_hhmmss.dump 文件是一个文本文件,里面记录着内存申请时的函数调用栈,以及申请的内存大小,以及内存内容。LeakTracer 提供了一个 leak-analyze-addr2line perl 脚本,其就是利用 addr2line 将记录的调用栈结合带有调试信息的可执行文件得到函数调用的代码出处,顺便统计这个调用栈在这个文件中出现的次数以及总共还存有多少释放的内存。

在使用 addr2line 过程中,有可能出现 ??:0 的打印,即分析不出代码行。出现这个问题的一个很大可能性就是,程序记录的是函数调用栈的内存地址,而 addr2line 需要的是相对偏移地址。我们在下文提及(参考 Boost.Stacktrace 提供的实现)。

valgrind

Valgrind 是内存检测非常强大的工具,它在 Linux 具有包管理器下,使用非常友好。但是在嵌入式场景下,使用就不是那么方便了。

因为其需要带调试信息的 glibc 动态库文件 libc.so.6 的库。 在具有包管理器的环境下,我们可以安装 libc6-dbg。但是在嵌入式环境下就比较麻烦了,如果文件系统构建时,构建了调试版本的 libc.so.6,那么拷贝至系统即可。

危险

如果没有,那么需要我们自己找到对应版本的 glibc 源代码,然后交叉编译得到调试版本的 libc.so.6,再将编译好的 libc.so.6 动态库拷进系统。

这一步,如果 glibc 版本号对不上或者其他原因,一不注意就会导致系统崩溃。

所以下文 交叉编译valgrind交叉编译glibc 只是做记录使用。

交叉编译valgrind

sudo apt-get install automake
./configure --prefix=/opt/aarch64-v01c01-linux-gnu-gcc/lib/valgrind-3.22.0 --host=aarch64-linux-gnu --enable-only64bit

在将valgrind-3.22.0部署到板子上后,需要将 libexec/valgrind 路径导出到 VALGRIND_LIB 变量:

export VALGRIND_LIB=/data/sdcard/valgrind-3.22.0/libexec/valgrind

然后执行:

valgrind --leak-check=yes danki

RTCP

· 阅读需 4 分钟

RTCP(Real-time Transport Control Protocol)是RTP(Real-time Transport Protocol)的控制协议,用于监测RTP传输的质量和控制RTP流的发送速率。

RTP被划分在传输层,它建立在UDP上。同UDP协议一样,为了实现其实时传输功能,RTP也有固定的封装形式。RTP用来为端到端的实时传输提供时间信息和流同步,但并不保证服务质量。服务质量由RTCP来提供。

网站备案

· 阅读需 1 分钟

前几天,应该是阿里的客服给我打了一个电话,大意是:

  • 网站下方未显示正确备案编号或编号未链接指向工信部网站(beian.miit.gov.cn),请尽快正确悬挂
  • 您的网站目前未接入使用阿里云内地节点服务器,但备案信息仍处于阿里云接入状态

然后等我下班后,想到最近我把ECS迁移到雨云上面去了,所以稀里糊涂的在ICP备案中,点击了取消接入,然后事情就变得麻烦了。最终导致备案号被注销了,通过域访问80和443端口直接被拦截。

备案服务码:

年终总结

· 阅读需 3 分钟

感觉时间过的越来越来,一下子,一年就过去了。

今年感觉经历了很多事,现在想起来,依稀感觉一切过的很快。也只有在上班的时候,才能叹气今天一天怎么还没过完,怎么还没到周末。

工作上觉得没有成长,也做得不开心,于是又选择裸辞换了一家公司。目前看了,我也不知到是对是错了。终归是从一个水深火热的坑跳到另一个水深火热的坑。

我没有大老板的资质,也做不出那种大大方方的总结。我有的,只有对过往生活的经历回忆。

整理笔记

在刚开始学习软件开发的时候,买了狄泰软件学院的《C++深度解析教程》、《QT实验分析教程》等等。那个时候,做笔记的时候,就是把讲师的课件,自己一课一课手动敲一遍,那么自己的笔记也就是讲师的课件。刚开始还觉得有用,因为时常有时候某个知识点忘记了,就可以随时打开 Markdwon 笔记看看。

不过现在工作也有四五年了,回过头来,发现很多笔记现在已经不会打开了,最简单例如《学习C++的意义》这篇笔记。久而久之,文件夹里积累的笔记文件越来越多,但是很多经常不会打开。这样就会有个问题,例如我这次忘记 std::error_code 如何使用了,怎么自己去创建 error_category 返回自定义 error_code。其实我之前是做过笔记的,但是现在笔记太多,导致我忘记了曾经做过这个笔记。

这个问题,除了建立好 搜索功能,另一个需要做的事,就是时常整理笔记,删掉那些已经不需要的内容。笔记记下来了,并不代表自己就掌握了这个知识,自己就会了,更多的需要转化成自己理解的陈述。我在一段时间,也曾非常热衷于翻译网上看到的英文博客,然后把它翻译记下来,这样的笔记,没有自己的理解转化,也很容易忘掉。

Edge更改IE兼容模式

· 阅读需 2 分钟

在工作中,有调试的设备需要使用IE内核的浏览器才能正常访问,但是是推荐的使用360浏览器,但是其不太好用,广告太多,总是弹出框要你安装360其它的产品。

Windows11 Edge提供了以IE兼容模式访问网站的设置,但是默认是以 IE 7 兼容的设置,而需要调试的设备网页需要 IE 10 才能正常访问,所以这时需要切换 IE 兼容版本。

先在Edge以兼容模式打开需要访问的网页,然后使用快捷键 Win + R 弹出运行选项卡,输入一下命令打开 IE 开发调试工具:

%systemroot%\system32\f12\IEChooser.exe

在开发调试工具中选中要调试的目标,在如下箭头标注的地方即可选择 IE兼容版本。