2019-11-07 08:05
⁄ 工业·编程
⁄ 共 673字
glibc是linux下面c标准库的实现,即GNU C Library。glibc本身是GNU旗下的C标准库,后来逐渐成为了Linux的标准c库,而Linux下原来的标准c库Linux libc逐渐不再被维护。Linux下面的标准c库不仅有这一个,如uclibc(https://www.uclibc.org/)、klibc,以及上面被提到的Linux libc,但是glibc无疑是用得最多的。glibc在/lib目录下的.so文件为libc.so.6。
任何类似Unix的操作系统都需要一个C库:定义“系统调用”的库和其他基本工具,...
c++阅读全文
2019-11-06 21:12
⁄ 工业·编程
⁄ 共 738字
The __KERNEL__ macro is defined because there is programs (like libraries) than include kernel code and there is many things that you don't want them to include. So most modules will want the__KERNEL__ macro to be enabled.
When you compile your kernel, __KERNEL__ is defined on the command line.
User-space programs need access to the kernel headers, but some of the info in kernel headers ...
GCC阅读全文
2019-11-05 20:54
⁄ 工业·编程
⁄ 共 1958字
在看linux内核代码的时候,经常会看到likely(x)和unlikely(x)宏的使用。那这两个宏有什么作用呢?
这两个宏在内核中的定义如下:
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
可见这里使用了gcc的内建函数__builtin_expect()。
__builtin_expect (long exp, long c)函数:
该函数用来引导gcc进行条件分支预测。在一条指令执行时,由于流水线的作用,CPU可以同时完成下...
GCC阅读全文
2019-11-04 23:02
⁄ 工业·编程
⁄ 共 805字
今天遇到一下奇怪的段错误,研究发现原来是内存写越界了。
函数片段如下 ht_insert_he --> ht_index --> hashfunction
void ht_insert_he(hash_table *table, hash_entry *entry) { hash_entry *tmp; unsigned int index; entry->timestamp = time(NULL); entry->next = NULL; ...
踩内存阅读全文
2019-11-03 23:01
⁄ 工业·编程
⁄ 共 1512字
众所周知,踩内存是一个非常麻烦的问题,不管是在应用层或是内核层,关于踩内存的检测也有各种各样的工具,比如应用层的优秀开源valgrind,内核内置的kmemcheck等。关于这些工具的具体信息就不在这里做进一步描述了,本文主要简单介绍一下几种踩内存工具的工作原理。
一种最为简单的踩内存工具为通过给分配的内存前后多加上一小块内存,用于存放我们预先设定的值,比如Crc和Magic: 不管是应用程序(App)或是内...
踩内存阅读全文
2019-11-02 22:52
⁄ 工业·编程
⁄ 共 13257字
1. 线程池基本原理
2. 线程池C语言实现 2.1 线程池的数据结构 #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <errno.h> #include <unistd.h>
typedef struct { void *(*function)(void *); /*函数指针,回调函...
线程池阅读全文
2019-11-01 22:40
⁄ 工业·编程
⁄ 共 5617字
在嵌入式应用开发过程中,踩内存的问题常常让人束手无策。使用gdb调试工具,可以大幅加快问题的定位。不过,对于某些踩内存的问题,它的表现是间接的,应用崩溃的位置也是不固定的,这就给问题定位带来了更大的困难。
笔者见过带有虚函数C++的类对象在试图调用虚函数时,因指向虚函数的表指针被踩了,导致获取虚函数的地址是错识的,从而应用崩溃。此问题的表现就是间接的:在踩内存发生时,应...
踩内存阅读全文
2019-10-31 22:37
⁄ 工业·编程
⁄ 共 374字
现象:
程序死的时候出现屏幕打印如下:
Program received signal SIGSEGV, Segmentation fault.
定位:
1、bt,打印当前调用栈。如果不是踩了栈的内存,那么这一个命令可以看出死在哪里。
2、如果bt打印消息如下:0x00000000 in ?? ()
那么基本可以确定是栈被踩了。
栈被踩一般而言是局部变量溢出导致。
3、可以看看黑匣子。黑匣子里...
踩内存阅读全文
2019-10-30 22:31
⁄ 工业·编程
⁄ 共 1005字
背景:做各个模块集成,其中包含了文件管理、录像业务相关的库。在文件管理初始化时,应用层会指定数据根目录。
现象:测试发现在执行特定操作时,目录失效,无法创建文件,日志大概这样 (NULL) /Movie/xxxx.MP4,好像是指定的根目录变空了。
检查一番, 没有进行去初始化, 跟文件管理库负责同事远程沟通了下,他在库里维护了一个指针,指向 应用 层设置的 目录字符串(这个方法当然不好,应该复制进去,后已修改),
...
踩内存阅读全文
2019-10-29 22:26
⁄ 工业·编程
⁄ 共 322字
语言由于可以直接操作内存,给我们的编程带来了便利,同时也带来了内存写越界之类的问题,常常造成我们的系统crash。下面总结了我在工作中碰到的导致内存越界的各种场景,以供分析此类问题时作个参考。
1、直接写越界,包括1)栈空间变量写越界覆盖掉函数返回地址,导致函数返回时crash。2)全局变量写越界,导致覆盖掉符号表中排在这个全局变量后面的全局变量的值。
2、未初始化指针变量的值写操作。
3、指针释放了未置空,后...
踩内存阅读全文