内存泄漏检测:
使用GDB在malloc和free函数设置断点,并打印分配和释放时的内存地址以及调用栈,然后通过脚本分析分配和释放是否配对来检测是否存在内存泄露以及发生内存泄漏的位置。
内存泄漏分析脚本,检测malloc释放有配对的free,如果没有那么打印该malloc的调用栈,通过调用栈可以找到分配内存的位置。
GDB 检测内存泄漏命令:
run
(gdb) info proc
(gdb) shell pmap 10683
[root@...]# ps faxu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 3月14 0:00 [kthreadd]
root 3592 11.8 25.3 9110048 2009168 ? Sl 3月14 179:33 \_ ./H323Gateway -x -c -i ../etc/H323Gateway.conf -m s.cgw.10.35.10.53 -n s.h323gw.10.35.10.53 -b tcp://127.0.0.1:10882
能够看到H323Gateway进程RSS巨大,可得出明显存在内存泄漏。
DGB 显示内存情况命令参数:
格式: x /nfu
说明:
x 是 examine 的缩写,意思是检查。
n表示要显示的内存单元的个数,比如:20
f表示显示方式, 可取如下值:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u表示一个地址单元的长度:
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
GDB 命令:
gdb ExeName : 开始调试,加-tui选项,分屏调试
break 函数名/行号 : 添加断点 (以行号添加时注意编译时要加-g选项,以在可执行文件中保存行号)
next(n)/next : 跳跃步数(执行一行,遇到函数不进入函数内部)
step : (同next,但是进入函数内部)
list : 列出代码上下文
print x
continue : 进行下次迭代
run : 开始调试
backtrace : 查看从哪里来,显示出所有当前存在的栈帧