- 博客(40)
- 收藏
- 关注
原创 内存改写coredump问题总结
我们在开发过程中经常碰到coredump问题,其中有一类是内存数据被异常改写导致的,对于这一类问题处理起来其实是比较困难的。根据实际调试经验针对这类问题进行归纳总结,方便后续问题定位。。
2023-06-29 20:52:48
704
原创 疑难问题定位案例复盘(四)
通过上述例子,我们了解了内核soft lockup的原理以及常规定位思路。当我们碰到了该问题时,可以尝试针对以下几种情形进行一一验证判断,从而定位根因。内核代码死循环内核自旋锁死锁短时间内中断数过多。
2023-05-03 20:29:26
933
原创 疑难问题定位案例复盘(三)
fdopendir/fdopen接口返回的目录流DIR *和文件流FILE *和open接口返回的句柄是指向的同一个文件file结构体,因此我们在使用fdopendir/fdopen接口完后,只需要选择close和closedir/fclose其中一个即可完成文件的关闭。若我们同时调用两类接口关闭文件将出现重复关闭句柄的现象,有可能关闭了其他正在使用的文件,造成数据异常。
2023-05-03 11:49:57
957
原创 疑难问题定位案例复盘(二)
今天我们继续分析一个因野指针访问导致的内存异常、出现coredump问题。在上一篇案例中,我们分享了一个在内存被释放后,业务模块仍然在使用导致业务模块自身出现coredump的现象。其实,在使用野指针访问内存时还有一种可能,就是业务模块在使用野指针继续访问内存没有导致业务模块自身出现异常,但由于该块内存已经属于一块空闲内存,它被glibc的ptmalloc虚拟内存分配器管理所管理。内存块相关结构如下:可以想象,。本次分享的案例就是基于上述原因产生的问题。
2023-05-01 23:40:59
1018
原创 排序算法---快速排序
背景之前我们介绍的选择排序、插入排序、快速排序的时间复杂度都是O(n2),在数据量较大时效率较低。因此我们利用分治思想设计出了两种效率更高的算法:归并排序和快速排序。归并排序和快速排序的时间复杂度都是O(nlogn),且在大多数情况下,快速排序比归并排序效率更高。原理快速排序的基本思想是分治原理,举例操作如下:1. 在待排序的数组中先选择一个数作为基准值,然后遍历整个数组,将小于基准值的元素放到基准值左边,将大于基准值的元素放到右边,这样就确定了基准值最后的正确位置。2. 递归处理基准
2022-03-30 20:07:11
978
原创 排序算法---选择排序/插入排序/冒泡排序
选择排序原理:每次排序将最小的元素放在当前未排序队列的第一个位置,且完成一个元素排序后下次从下一个位置开始重复上述过程。void Swap(int *piData1, int *piData2){ int iTmp = 0; iTmp = *piData1; *piData1 = *piData2; *piData2 = iTmp; return;}void SelectSort(int aiArray[], int iArrayLen){
2022-03-29 19:29:34
572
原创 排序算法---归并排序
1. 归并操作归并排序是在归并操作上实现的。先了解一下归并操作的原理。归并操作:将两个有序数组合并为一个新的有序数组。如有序数组A=[1, 4, 6], B=[2, 4, 5],将其进行合并。设置变量下标i和j分别表示数组A和B的下标。遍历完数组A和B,最终合并后数组为C。若A[i] <= B[j],则将A[i]保存到数组C,并将i++; 若A[i] > B[j],则将B[j]保存到数组C,并将j++;归并操作的具体实现如下:void Merge(int *piAr
2022-03-20 15:31:01
2117
原创 gdb调试时好用的命令
set print pretty我们在gdb调试时经常需要利用p命令打印结构体数据信息。默认情况下,p命令会以顺序罗列出来,这会显得很拥挤,不便于阅读。下面以一个实例进行说明。实例代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define MAX_SENSOR_NAME_LEN 256
2021-11-28 16:21:47
5152
1
原创 linux堆内存管理
堆内存的使用在linux开发过程中非常普遍,我们有必要了解相关的内存管理方便我们对内存问题的理解和定位。堆内存结构层次linux的堆内存管理分为三个层次,分别为分配区area、堆heap和内存块chunk。area:堆内存最上层即为分配区area。分配区area分为主分配区(main area)和线程分配区(thread area)。主进程堆空间对应的分配区即为主分配区main area,每个进程仅有一个主分配区,对应我们通常所说的bss段上面堆空间位置。线程堆空间对应的分配区即为线程分配区
2021-11-16 15:23:25
2919
原创 linux获取符号表调试
我们在利用gdb调试时通常需要符号表才可以方便地打断点、查看详细变量、位置信息。为了获取对应的可执行文件/动态库的符号表,我们在编译时必须加上-g参数生成对应的符号信息。通常,我们有两种方式获取对应的符号。下面以实例进行说明。main.c文件: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 #include.
2021-11-11 19:25:32
3362
原创 linux程序运行时相关库路径及查找
linux程序在编译、链接、运行时涉及多个路径,我们经常分不清楚。下面对几个相关路径进行说明。PATH环境变量我们在编译程序时经常提到PATH这个环境变量,特别是交叉编译时。PATH环境变量指定的是可执行程序的查找路径。PATH环境变量通常可以通过以下几种方法进行设置:(其他环境变量设置方法也类似)1. 利用export命令设置如设置PATH环境变量添加/home/test路径export PATH=$PATH:/home/test在添加时注意不要覆盖原有的PATH变量值。另
2021-11-11 09:36:30
4902
原创 glibc编译方法
我们在开发过程中,有时候可能需要根据我们的业务场景对glibc进行定制化修改,因此有必要了解glibc的编译方法。通常编译glibc需要以下几个步骤:1. 由于我们一般是在x86环境的编译服务器下编译运行在arm环境下的目标固件,因此我们通常需要利用交叉编译工具链。所以,我们首先需要指定我们的交叉编译工具链的路径。export PATH=$PATH:/home/xxxx(交叉编译工具链路径)2. 利用configure编译生成makefile文件...
2021-11-09 14:48:21
10892
1
原创 linux malloc内存数据结构分析
在linux用户态程序中,我们经常调用malloc接口根据自身需要灵活分配内存。但是我们是否了解malloc所分配的内存相关数据结构在内存中的具体分布呢?下面我们以实际程序实例介绍malloc分配的内存数据结构。malloc分配内存数据结构malloc分配的内存为一个个chunk,每个chunk有一个头部,对应的数据结构为malloc_chunk,具体如下:malloc_chunk结构体中各个变量含义如下:prev_size:当前一个chunk为free(空闲可用)时,prevent_s
2021-09-25 17:41:40
2509
1
原创 ELF动态链接时GOT、PLT原理
背景我们知道linux为了降低可执行程序体积,提高空间利用效率,经常采用动态链接方式生成动态库或者可执行程序。在动态链接时,为了避免在加载时对代码段进行重定位导致动态库代码段无法实现共享,我们采用了位置无关代码PIC技术(Position-Independent Code)。针对模块外代码,为了实现PIC技术,我们需要借助全局偏移表(GOT,Gobal Offset Table)。全局偏移表GOT首先写一个小的测试程序进行说明。在SendMessage.c文件中实现了一个函数SendMessag
2021-09-24 00:58:10
2044
原创 linux内核slab层
需求背景在linux中我们通常需要自行动态申请、释放内存。对于某些应用场景,如进程描述(task_struct结构)、索引节点对象(struct inode)存放,我们往往需要经常性申请、释放。如果我们直接这么操作的话,频繁地申请、释放内存必然带来效率的降低和管理的不便。如果我们应用场景的内存块自行建立一个空闲链表专门用于回收释放的内存,当需要使用时再从空闲链表中取出,这样就减少了实际申请、释放内存次数,大大提高了内存管理效率。linux内核中slab层正是基于上述思想创建。slab层不仅能解决内存
2021-09-11 20:19:06
533
原创 内核内存分配接口
以页为单位分配/释放内存 内核中对内存的管理以页为单位。32位linux系统页大小为4K,64位linux系统页大小为8K。常见页内存分配接口如下:页分配内存接口 接口名称 作用 alloc_page(gfp_mask) 只分配一页,返回指向页结构指针 alloc_pages(gfp_mask, order) 分配页,返回指向第一个页结构指针 __get_free_page(gfp_mask) 只分配一页,返回指向其逻辑地址的指针 __get_free_..
2021-09-11 17:42:23
476
原创 常见网络设备作用
集线器集线器工作在物理层,它用于将网络设备进行直连。下面进行举例说明:假设A、B、C三台电脑同时连在一台集线器上。当A电脑给B电脑发送一条信息后,该信息首先会进入集线器的中继电路。集线器的中继电路在收到该信息后会将该信息无脑发送给连接在该集线器上的所有设备,也即B、C电脑均会收到该信息。B电脑在收到该信息后...
2021-09-07 15:59:10
2382
原创 linux进程调度CFS策略
linux调度策略分多种,其中最常见的就是CFS(Completely Fair Schedule)调度策略。下面主要介绍一下CFS调度策略的原理及实现流程。
2021-06-02 14:10:11
523
原创 malloc底层实现原理
malloc接口对于我们来说肯定不陌生。我们经常使用该接口在堆上动态分配内存,但是我们有没有想过malloc的底层实现是什么样的呢?下面我们简单介绍一下malloc的底层实现原理。malloc作为一个库函数,用于根据开发人员的需求在堆上动态分配内存。根据需要分配的内存大小,实现方式分以下两类:分配的内存大小小于128k 分配的内存大小大于128k...
2021-05-19 17:49:11
1054
原创 linux虚拟地址到物理地址映射
我们知道linux下编程cpu接触的都是虚拟地址,而最终访问的实际物理内存。因此需要在虚拟地址和实际物理地址之间建立一种映射关系,即页表。使用虚拟地址有以下几个优势:进程之间地址隔离因为每个进程都有独立的4G虚拟地址空间,且包括一套自己的虚拟地址到物理地址映射页表。因此各个进程可以使用相同的虚拟地址,只不过最终映射到不同的物理内存上(共享内存除外),互不干扰,提高系统安全性。管理进程对内存的访问权限通过页表,标识进程对该内存的读写访问,保证进程对内存的正确访问虚拟地址到物理地址之间映射通
2021-05-11 15:31:36
1377
2
原创 软连接与硬链接
linux中链接包括两种类型:软链接和硬链接。两者的区别如下:硬链接和对应的链接源文件指向同一个inode,通过ls -i命令查看可发现两者的inode节点值相同。 软链接和对应的链接源文件的inode节点值不同,软链接其实指向的是对应的链接源文件,不是直接指向原始inode数据,两者指向不同的数据块。通过文件大小可以看到,源文件test1.txt、硬链接文件test2.txt的大小均为0,因为没有写入任何数据。而软链接文件test3.txt大小为9字节,即它的源文件名“tes...
2021-05-08 11:41:08
160
原创 Linux下SVN的用法
1. 将SVN上文件下载到本地svn checkout path /*path即为服务器上的目录*/如:svn checkout svn://192.168.1.1/project可简记为:svn co2. 向版本库中添加新的文件svn add file /*file即为所要添加的文件*/如:svn add test.c svn add *.c /*...
2021-05-07 23:20:43
175
原创 2>&1相关作用
我们在阅读或者写shell脚本时经常碰到一行命令的后面带上符号:2>&1,对此可能会有疑问是啥意思?下面进行简单分析。/usr/local/bin/CSDN.sh > /var/tmp/csdn_result.txt 2>&1 &linux的文件句柄(系统接口open返回值)为一系列非0整数值,该值通常有一个最大值,即linux设置的单个进程可打开的最大文件数。linux把文件句柄0、1、2分别用于对应标准输入、标准输出、错误输出。默认情况下错误输出和标准输
2021-05-07 15:42:31
677
原创 const修饰指针用法
const关键字作用:当const修饰一个变量时,该变量则不能改变。const用法主要包括以下几类:const修饰普通变量,则该变量的值将不能通过赋值改变。 const int a = 10;a = 3; /* 此处错误,变量a的值不能改变 */printf("a:%d\n", a); ...
2021-05-05 15:00:27
845
原创 linux字节对齐规则
在计算内存对齐之前,首先梳理几个概念:数据成员自身对齐值:该数据成员的大小值 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值 指定对齐值:linux 32默认为4,linux 64默认为8。可以通过@pragma pack (value)...
2021-05-04 16:06:03
1209
原创 Linux man手册的9种分类
1 - commands(普通的命令)2 - system calls(系统调用)3 - library calls(库函数)4 - special files(特殊文件:/dev下设备文件)5 - file formats and convertions(文件格式)6 - games for linux(游戏和娱乐)7 - macro packages and conventions(杂项)8 - system management commands(管理员命令)9 ...
2021-03-07 18:22:23
294
原创 Linux下查找串口服务器所有连接端口和网络设备方法
假设串口服务器的地址为192.168.20.203,查找第5个串口的实际端口。1. 首先登串口服务器的管理端口。一般telnet访问的默认管理端口为23. telnet://192.168.20.203:23. admin admin2. 进入下一级菜单 system view3. 进入任意一个串口。一般串口的tty从81开始,则可选择进入tty ...
2018-07-25 14:03:28
3412
原创 Linux下利用GCC和GDB调试程序方法
一. 利用GCC编译程序:(以test.c程序为例进行说明)1. 先生成目标文件,再生成可执行文件。 gcc -c test.c /*将test.c源代码编译成目标文件,生成test.o文件*/gcc -o test test.o /*将生成的test.o文件链接生成可执行文件test*/2. 一步生成可执行文件,不产生目标文件。其中-Wall可产生更详细的编译过...
2018-07-20 17:17:37
490
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人