
Linux实践记录
文章平均质量分 95
记录Linux的实践经历,经验有时候也是一种宝贵的财富
Once-Day
长路漫漫,一人太孤单,无人理解,独自前行,给世界留下一点微不足道的痕迹,稍微弥补曾经的遗憾。
展开
-
Linux错误(6)X64向量指令访问地址未对齐引起SIGSEGV
X64设备上,如果定义一个结构体,其包含连续的整数字段,并且存在类似的算术操作,编译会自动优化代码,生成向量指令SSE/AVX(xmm0),但是由于这些结构体的地址没有对齐到16字节,读取数据时会触发SIGSEGV错误,造成coredump。/* 禁止内联 */// data128_add函数二进制反汇编如下GDB调试运行结果如下,可以清晰看到执行的指令、代码行和数据地址信息:/* 禁止内联 */// -O3 编译会生成如下代码// 申请一段内存, 64字节。原创 2025-04-04 22:45:33 · 1010 阅读 · 7 评论 -
C之(16)scan-build与clang-tidy使用
Clang是一个由Apple主导开发的开源编译器前端项目,旨在提供一个现代化、高效、易于使用和可扩展的编译器工具链。Clang项目的主要目标是为C、C++、Objective-C等编程语言提供更好的编译支持,同时与底层的LLVM编译器基础设施紧密集成。Clang采用模块化的架构设计,将编译过程分为词法分析、语法分析、语义分析、代码生成等多个阶段,每个阶段都有相应的库和工具来处理。这种模块化的设计使得Clang易于理解、维护和扩展,开发者可以方便地为Clang添加新的功能或优化现有功能。原创 2025-03-30 18:39:37 · 1253 阅读 · 40 评论 -
内存检查之Valgrind工具
Valgrind是一个功能强大的开源动态分析工具,主要用于检测和调试C/C++程序中的内存管理和线程同步问题。它最初由Julian Seward在2000年开发,旨在帮助程序员发现难以捕捉的bug,特别是那些与内存相关的错误,如内存泄漏、越界访问、使用未初始化的内存等。经过多年的发展和完善,Valgrind已经成为了业界广泛使用的调试工具之一。它不仅支持Linux,还可以在macOS和Android等平台上运行。原创 2025-03-26 21:48:33 · 1305 阅读 · 37 评论 -
C之(15)cppcheck使用介绍
Cppcheck是一款静态代码分析工具,专门用于检查C/C++代码中潜在的错误和漏洞。它由瑞典程序员Daniel Marjamäki在2007年开发,旨在帮助开发者提高代码质量,减少bug。Cppcheck的诞生源于Daniel在工作中遇到的一些棘手的编程问题。他发现,许多C/C++项目中存在许多常见的编码错误,如内存泄漏、未初始化变量、数组越界等,这些问题不易被发现,但却可能导致程序崩溃或产生安全隐患。为了解决这一痛点,Daniel利用业余时间开发了Cppcheck。原创 2025-03-23 22:19:25 · 1568 阅读 · 47 评论 -
Git(12)GitLab持续集成(CICD)
Continuous Integration (CI) 持续集成:假设一个应用程序,其代码存储在GitLab的Git仓库中。开发人员每天都要多次推送代码更改。对于每次向仓库的推送,都可以创建一组脚本来自动构建和测试你的应用程序,从而减少了向应用程序引入错误的机会。Continuous Delivery (CD) 持续交付:应用程序不仅会在推送到代码库的每次代码更改时进行构建和测试,而且,尽管部署是手动触发的,但作为一个附加步骤,它也可以连续部署。原创 2025-03-20 21:43:20 · 1644 阅读 · 35 评论 -
Linux错误(2)程序触发SIGBUS信号分析
SIGBUS是BUS error的缩写,中文称为总线错误信号。它是Unix/Linux系统中的一种异常信号,通常在访问内存时发生某些类型的错误时产生。地址对齐错误(Alignment Fault):当访问的内存地址不满足硬件的对齐要求时触发。例如在需要4字节对齐的系统上访问一个地址不是4的倍数的int变量。未映射的物理地址访问:试图访问未映射到任何设备的物理地址空间时会触发SIGBUS。这可能是由错误的指针运算或直接访问物理内存导致的。特定于设备的硬件错误。原创 2025-03-17 23:03:07 · 1183 阅读 · 36 评论 -
Linux错误(5)程序fork子进程后访问内存触发缺页中断(COW)
在一个多线程程序中,使用popen()创建子进程后,系统出现了大量缺页中断(Page Fault),导致瞬间突发耗时(约 50ms)。由于popen()本质上调用了fork(),而fork()在多线程环境下可能会触发写时拷贝(Copy-On-Write, COW),进而导致内存页复制,引发性能抖动。是创建子进程并执行新程序的高效方法,通常用于替代组合。避免fork()继承大量地址空间,减少写时拷贝(COW)和缺页中断。实现方式因系统不同,在Linux,可能使用vfork()进行优化。在macOS,原创 2025-03-12 21:14:23 · 2355 阅读 · 33 评论 -
easelog(1)基础C++日志功能实现
(1) 支持日志级别分类:DEBUG、INFO、WARNING、ERROR,可选支持FATAL。(2) 输出信息类别:时间戳、进程ID、线程ID、函数名、代码行号和日志信息(支持不定参数)。(3) 支持多线程:要求时间戳不能乱序,性能方面没有特别要求。原创 2025-02-22 21:49:16 · 1038 阅读 · 4 评论 -
GCC之编译(8)AR打包命令
GCC中的AR命令全称是Archive,是一个用于创建、修改和提取档案(archive)文件的工具。档案文件通常用于将多个目标文件打包成一个文件,以便于管理和分发。AR命令在Linux/Unix系统的开发和构建过程中经常使用。以下是AR命令的一些常见用法:(1)创建档案文件上述命令会创建一个名为libmylib.a的档案文件,并将file1.ofile2.o和file3.o三个目标文件打包进去。(2)查看档案文件内容该命令会列出libmylib.a档案文件中包含的所有目标文件。(3)原创 2025-01-25 21:36:53 · 3021 阅读 · 17 评论 -
Linux-arm(1)ATF启动流程
ARM ATF-A (ARM Trusted Firmware-A)是ARM官方为ARMv8-A架构提供的一套开源、安全、可靠的参考firmware实现。它主要面向ARM64(AArch64)和ARM32(AArch32)架构,提供了全面的安全世界(Secure World)支持和丰富的功能。ATF-A支持ARMv7-A和ARMv8-A架构系列处理器,包括Cortex-A53/57/72/73/75/76/77等。原创 2025-01-23 23:29:39 · 2993 阅读 · 32 评论 -
C++(2)之Linux多线程服务端编程总结
Author: Once Day Date: 2023年1月31日/2024年8月23日一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…漫漫长路,有人对你微笑过嘛…原创 2024-09-10 21:47:39 · 2017 阅读 · 13 评论 -
Linux之ebpf(3)uprobe与ebpf
Linux 内核从 3.5 版本开始引入了 uprobe 功能,它是一种用户态的动态追踪技术。Uprobe 允许在用户空间的应用程序中插入探测点,以便实时监控和跟踪程序的运行状态和行为,而无需修改或重新编译应用程序的源代码。Uprobe 的工作原理如下:在目标应用程序的特定指令位置设置探测点。当程序执行到该指令时,会触发探测点。探测点被触发后,程序执行流程会被中断,并将控制权转移给预先注册的探测处理程序。探测处理程序可以访问寄存器、内存等程序运行时的上下文信息,以此来分析和记录程序的状态。原创 2024-09-07 16:45:22 · 3353 阅读 · 63 评论 -
CMake(1)基础使用
CMake是一个开源的跨平台自动化构建工具,它主要用于管理大型软件项目的构建、测试和打包过程。CMake通过编写简单的配置文件来描述项目的构建过程,然后根据不同平台的特性生成对应的本地化构建文件,如Unix下的Makefile或Windows下的Visual Studio项目文件。使用CMake可以让开发者从复杂的构建细节中解放出来,专注于代码的编写和维护。跨平台性:CMake支持多种操作系统和编译器,使得项目可以轻松地在不同平台上构建。简单易用:CMake使用简洁的语法编写配置文件,学习曲线相对平缓。原创 2024-06-29 15:39:16 · 1636 阅读 · 105 评论 -
Linux错误(3)Linux里IP套接字sendmsg出现EPERM错误
Linux中使用sendmsg系统调用通过IP socket发送数据时,如果出现EPERM错误,通常有以下几种可能原因,进程没有足够的权限,使用了无效的socket选项....原创 2024-04-18 20:14:44 · 1378 阅读 · 25 评论 -
代码训练LeetCode(9)Git自动同步脚本
通过这个题目,我们可以学习到如何使用bash脚本来自动化Git仓库的同步过程,并且可以增强我们对Git命令和脚本编写的理解。要提升能力,最好的方式是实践这些脚本,实际应用在日常的版本控制任务中,并在实践中学习如何处理各种可能出现的情况,比如合并冲突等。同时,了解更多的Git命令和选项可以帮助我们编写更复杂的脚本,以适应更多的应用场景。原创 2024-03-13 23:42:33 · 1287 阅读 · 32 评论 -
GDB之(8)GDB-Server远程调试
GDB,全称GNU Debugger,是一个在GNU操作系统下的强大的程序调试工具,广泛应用于Unix及类Unix系统中用以调试多种编程语言编写的程序,尤其是C和C++语言。它由Richard Stallman于1980年代创建,至今仍然是开源社区中使用最为广泛的调试器之一。GDB允许程序员看到程序执行时的内部情况,诸如变量值、程序调用栈等信息,能够在程序执行到特定点时暂停,或者在出现错误时停下来。这就好比给程序员一副透视眼镜,能够洞察程序的内部运行机制。原创 2024-02-28 02:01:16 · 7917 阅读 · 40 评论 -
GDB之(5)线程和进程调试
在操作系统的世界里,尤其是在Linux这一广受欢迎的开源系统中,进程(Process)和线程(Thread)是两种基础且核心的执行单位,它们共同构建起了系统进行任务管理和调度的基石。为了理解二者的联系和区别,可以将进程想象为一个工厂,而线程则是工厂里的工人。进程可以被看作是一个程序的运行实例。它拥有独立的内存空间、数据栈以及其他用于跟踪执行的辅助数据。每个进程至少有一个线程,即主线程,但可以包含更多的线程。在Linux中,创建进程通常通过系统调用fork()原创 2024-02-28 01:56:22 · 1744 阅读 · 7 评论 -
GDB之(7)监视内存和库加载
在GDB中监控内存区域并在该区域被读取或写入时触发断点,可以使用watch命令来实现。启动GDB并加载你的程序设置断点以停止程序的执行这样你就可以在感兴趣的内存区域被访问之前设置监视点。运行程序(gdb) run找到你想监控的内存地址假设你已经知道了内存的具体地址,或者你可以通过程序变量来获取它。设置监视点假设你想监控的内存地址是0x12345678,你可以使用以下命令来监视这个地址:其中type是内存地址处数据的类型,例如intchar等。继续程序执行。原创 2024-01-25 22:49:37 · 2384 阅读 · 0 评论 -
GDB之(4)调试Python代码
如果Python程序挂住了,想查看Python代码的栈,但是用GDB看到的是C栈,本文介绍使用gdb的python扩展来查看python代码栈。如上面,搜索一下目录,看看是否有,如果没有需要安装对应的工具,这里自带的是python3的调试扩展。对于Python2,需要安装对应的包扩展才行。如上所示,安装对应的python2-gdb扩展即可。原创 2023-03-22 23:09:09 · 4970 阅读 · 0 评论 -
GDB之(1)入门指令参数介绍
GDB(GNU Debugger)是GNU开源组织发布的一个强大的Unix/Linux程序调试工具。在软件开发的调试阶段,GDB提供了程序员在程序暂停执行的情况下,查看和修改程序内部的功能。这对于跟踪错误和异常行为,在复杂的系统中尤为重要。本文简要介绍了gdb的入门指令。原创 2024-02-27 00:40:39 · 1424 阅读 · 6 评论 -
(8)Linux使用C语言读取proc/stat等cpu使用数据
在Linux系统中,`/proc`文件系统包含了系统运行时的信息,其中也包括了CPU的使用情况。`/proc`实际上是一个虚拟文件系统,它将内核和系统信息以文件的形式展现给用户和程序。要从`/proc`获取CPU的使用率,我们可以读取`/proc/stat`文件,这个文件包含了一系列以空格分隔的数字,其中第一行以`cpu`开头的数字就是关键信息,它们分别代表了不同类型的CPU时间。原创 2024-02-24 19:29:53 · 3306 阅读 · 31 评论 -
Linux使用C语言获取进程信息
在计算机的世界里,Linux进程是一个非常基础而且关键的概念。它可以被理解为正在执行的一个程序的实例。每个进程都有自己独特的身份,我们称之为进程ID(PID),就像每个人都有自己的身份证号码一样。Linux操作系统是一种多任务操作系统,可以同时运行多个进程,就像一个杂技团队能同时上演多个节目一样。现在,想象一下进程是厨房里的一个厨师,而计算机资源(如CPU、内存)则是厨房里的炉子、锅碗瓢盆。每个厨师都需要这些资源来完成他们的烹饪任务。原创 2024-02-23 00:33:31 · 2492 阅读 · 0 评论 -
OD(7)之time调用与Linux-vDSO机制
突然发现一个忽略的知识点,本来以前总是觉得time调用耗时很多,然后就应该用等支持vDSO的函数。但定位代码时,发现原来time实现(glibc)的底层未必是SYS_time函数,也就是系统调用。当然,不同平台的情况有所区别,这里测试平台是Linux4.14(aarch64)和Linux5.10(x64)。在Linux操作系统中,vDSO(即虚拟动态共享对象)是一个提高系统调用性能的机制。它允许程序直接在用户空间中执行一些系统调用,而无需进行传统的、开销较大的内核空间到用户空间的上下文切换。原创 2024-02-20 02:08:02 · 934 阅读 · 3 评论 -
Linux之kernel(20)kdump支持
Author:OnceDay Date:2024年1月14日漫漫长路,有人对你微笑过嘛…3.3.2 内核态调测工具:kdump&crash——kdump - 知乎 (zhihu.com)Linux]Kdump简介&配置、触发 - WinkJie - 博客园 (cnblogs.com)linux内核调试之 kdump安装配置 - 知乎 (zhihu.com)一文解决内核调试之Kdump的原理及配置 - 知乎 (zhihu.com)【调试】kdump原理及其使用方法 - 知乎 (zhihu.com)原创 2024-01-16 23:33:30 · 1465 阅读 · 0 评论 -
OD(4)之libunwind打印堆栈信息
libunwind是一个用于确定程序的调用栈的便携式和高效的编程库。它最初是为了改善在IA-64上的Linux系统上的程序性能分析和错误调试,但后来被扩展到支持其他架构。libunwind项目始于2000年代初期,并且随着时间的推移,它已经被各种系统和架构所采纳。libunwind提供了一组API,允许程序在运行时查询和设置调用帧的状态,主要用于堆栈跟踪(stack unwinding)。这个功能对于异常处理、程序调试以及任何需要检查程序调用历史的场景都非常有用。便携性:支持多种处理器架构和操作系统。原创 2024-01-12 00:18:06 · 3016 阅读 · 0 评论 -
linux之buildroot(3)配置软件包
本文介绍了buildroot常见的编译指令和软件包支持参数,以及如何集成到开发环境中使用。原创 2023-12-02 00:49:55 · 2456 阅读 · 0 评论 -
linux之buildroot(2)配置toolchain
buildroot提供两种toolchain使用方式,内部工具链和外部工具链,并且buildroot也支持生成toolchain sdk,用于构建新的交叉开发环境,这篇文章介绍了如何在buildroot使用toolchain以及生成定制的toolchain sdk。原创 2023-11-29 10:04:36 · 3108 阅读 · 0 评论 -
linux之buildroot(1)构建系统基础
Buildroot和Yocto是两种用于嵌入式Linux系统开发的工具,可以构建完整的根文件系统(root filesystem),包括内核、引导加载器和用户空间应用程序。Buildroot是一个简单、高效的嵌入式Linux系统构建工具,使用Makefile和Kconfig配置系统(与Linux内核相同)。Buildroot是高度可配置的,可以为各种目标板构建精简的Linux系统。它使用交叉编译,可以快速生成一个小型的、在目标硬件上运行的Linux系统。原创 2023-11-24 09:18:06 · 2884 阅读 · 0 评论 -
linux之perf(4)stat统计
perf是Linux内核提供的一个强大的性能分析工具,用于测量和分析系统和应用程序的性能。perf stats是perf工具中的一个命令,用于收集并显示执行特定命令的统计信息。perf stat当你运行perf stat命令时,它会在命令执行结束后显示一些统计信息,包括CPU周期、指令数、缓存引用、缓存未命中等。下面是一些常见的perf stat-e--event:用于指定要测量的事件。你可以指定多个事件,用逗号隔开。-p--pid:用于指定要测量的进程ID。-r--repeat。原创 2023-09-17 17:06:28 · 2123 阅读 · 0 评论 -
一文读懂TSC时钟: (x86_64/arm64)实现介绍和编程使用
TSC时钟是一种高精度的硬件时钟,可提供微秒级的时间精度。它利用处理器的时间戳计数器来直接读取时间戳,从而达到高精度。TSC时钟现已在主流的X86和ARM架构处理器中广泛应用。TSC时钟工作原理简单,时钟频率等于处理器时钟频率,每经过一个处理器时钟周期就增加一个计数。与其他时钟相比, TSC时钟无须复杂的设置与校准,使用简便,精度高且稳定。在X86平台,通过rdtsc指令读取TSC计数器;在ARM64平台,通过mrs指令读取CNTVCT计数寄存器的值来实现。原创 2023-05-30 23:33:42 · 6385 阅读 · 0 评论 -
“互联网的神经系统”——浅析消息中间件MOM
这里是250个中文字符内的MOM基础知识摘要:消息中间件MOM(Message Oriented Middleware)是应用间传递消息的中间软件,它接收和路由来自应用程序的消息。MOM使得应用程序之间可以异步地通信,而无需专门链接到对方,只需要把消息发送到消息服务器,由它来推送给订阅的接收方。MOM屏蔽了应用程序之间的详细实现,降低了应用间的耦合度。主要功能有:生产者与消费者的解耦,异步通信,扩展性好,可靠性和存储消息等。原创 2023-05-29 22:07:14 · 1124 阅读 · 0 评论 -
内存检查之libasan.so工具
使用C/C++开发程序,对于大型复杂代码,容易出现内存异常问题,这个可能导致非常多的意外情况。Heap OOB(HeapOutOfBounds 堆内存越界)Stack OOB(StackOutOfBounds 栈越界)Global OOB(GlobalOutOfBounds 全局变量越界)UAF(UseAfterFree 内存释放后使用)原创 2023-05-11 23:20:23 · 3997 阅读 · 1 评论 -
Linux之(27)networkctl命令
Author:OnceDay Date:2023年4月25日漫漫长路,有人对你微笑过嘛…networkctl 命令 – 人人都懂物联网 (getiot.tech)如何在Linux上设置systemd-networked - A5互联 - 博客园 (cnblogs.com)systemd-networkd-wait-online.service-小白笔记_码灵的博客-优快云博客。原创 2023-04-25 23:54:35 · 4273 阅读 · 0 评论 -
linux之cgroup(1)基础概念总结
cgroup是于2.6内核由Google公司主导引入的,是Linux内核实现资源虚拟化的技术基石,和docker容器所用到的资源隔离技术,正是Cgroup。cgroup子系统的全称是control groups,提供对CPU、内存、网络等资源实现精细化控制的能力。允许对某一个进程,或某一组进程所用到的资源进行控制。cgroup和namespace都会对进程进行分组,但两者作用不一样,namespace会隔离进程组之间的资源,cgroup则可以对一组进程进行统一的资源监控和限制。cgroup有两个版本,v1。原创 2023-03-21 00:16:46 · 925 阅读 · 0 评论 -
GDB之(2)调试CoreDump文件
当进程收到某些信号时,默认的信号处理函数在终止进程之前会对进程的内存映像进行存储,形成当前时刻的“快照”,这个“快照”就是Core dumped。程序设置了用户id(调用了setuid),当当前用户并非该程序文件的所有者。程序设置了组id(即调用segid),当当前用户并非该程序文件的组所有者。文件,添加coredump对应目录及格式,此处user为用户名对应目录。这开启了core dump功能,而且还没有限制文件大小,可以将。%g,所dump进程的实际组ID。%p,所dump进程的进程ID。原创 2022-08-01 13:12:22 · 2367 阅读 · 0 评论 -
Python之VScode基本开发环境
依赖包:flake8、pycodestyle=2.9.0、pyflakes=2.5.0、mccabe=0.7.0。联机安装vscode比较容易,离线安装可参考以下文章:离线安装vscode Onceday 优快云博客。Windows安装Python可参考以下文章:Python安装 Onceday 优快云博客。代码格式和语法检查pylint:(这个暂时不用)2.安装三款静态检查工具和代码格式化工具。4.使用额外拼写检查插件。1.临时下载某个软件。.........原创 2022-08-10 15:11:52 · 471 阅读 · 0 评论 -
Linux虚拟机新增磁盘分区格式化和挂载
现代Linux系统,一般系统盘前两个都用来做boot和UEFI代码存放,因此实际数据盘都是从sda3开始了。使用virtualbox安装ubuntu,并更换镜像源,安装vscode-server,ssh等组件。可以看到sdb即是目标磁盘,其类型为disk,而sda就是已分区的磁盘。有很多可用的文件系统可供选择,如ext4,目前xfs比较适合。目前MBR分区比较受限,支持大硬盘和多分区的GPT格式更好。...原创 2022-08-09 17:03:22 · 1549 阅读 · 0 评论