进程内存管理与valgrind工具

1. 进程内存映射


附1:
file 指令:查看文件类型

size 指令:查看文件大小


一个可执行程序包含三个部分
代码段:主要存放指令,操作以及只读的(常量)数据(例如字符串常量)。
数据段:全局或者静态的已经初始化的变量。
BSS段:全局或者静态的未初始化的变量。


附2:
ps aux|grep test 进程查看命令

cat proc maps 进程内存映射查看命令

a.程序中申请堆空间

b.用ps aux|grep指令,查看进程


c.用cat proc maps指令,查看进程内存映射



参数 解释
address: 0085d000-00872000 虚拟内存区域的起始和终止地址文件所占的地址空间
perms:rw-p 权限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
offset: 00000000 虚拟内存区域在被映射文件中的偏移量
dev: 03:08 文件的主设备号和次设备号
inode: 设备的节点号,0表示没有节点与内存相对应
name: /lib/ld-2.3.4.so 被映射文件的文件名


各共享库的代码段,存放着二进制可执行的机器指令,是由kernel把该库ELF文件的代码段map到虚存空间;
各共享库的数据段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间;
用户代码段,存放着二进制形式的可执行的机器指令,是由kernel把ELF文件的代码段map到虚存空间;
用户数据段之上是代码段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间;
用户数据段之下是堆(heap),当且仅当malloc调用时存在,是由kernel把匿名内存map到虚存空间,堆则在程序中没有调用malloc的情况下不存在;

用户数据段之下是栈(stack),作为进程的临时数据区,是由kernel把匿名内存map到虚存空间,栈空间的增长方向是从高地址到低地址。


2.常见内存错误及valgrind工具使用


内存检测工具主要检查下面的程序错误:
  1.使用未初始化的内存 (Use of uninitialised memory)
  2.使用已经释放了的内存 (Reading/writing memory after it has been free’d)
  3.使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)
  4.对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)
  5.申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever)
  6.malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
  7.src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)


valgrind工具:

安装:sudo apt-get install valgrind

使用:

a.编译(必须加上-g)
gcc -o test test.c -g


b.使用valgrind工具
valgrind --tool=memcheck --show-reachable=yes --read-var-info=yes --verbose --time-stamp=yes --leak-check=full --log-file=mylog.log ./test


c.查看日志
less mylog.log

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值