[TOC]
内存泄漏分类:
TODO
内存泄漏有以下几种工具可以用于定位问题:
- GCC/LLVM自带的工具:LeakSanitizer
- Valgrind
- ...
具体使用参考:开发工具#GCC#使用LeakSanitizer定位内存访问错误, 开发工具#Valgrind#使用
TODO
核心转存(coredump),实际为进程运行过程中的一个内存快照;当进程crash时,操作系统接收到异常指令后,在进程crash之前,把进程做一个内存快照,保存进程的地址,寄存器,堆栈调用等信息,这个文件就叫coredump。
Window下生成的是MiniDump。
Linux下CoreDump文件经由以下信号产生:
| 信号 | 说明 |
|---|---|
| SIGABRT | 异常终止(abort) |
| SIGBUS | 硬件故障 |
| SIGEMT | 硬件故障 |
| SIGFPE | 算术异常 |
| SIGILL | 非法硬件指令 |
| SIGIOT | 硬件故障 |
| SIGQUIT | 终端退出符 |
| SIGSEGV | 无效存储访问 |
| SIGSYS | 无效系统调用 |
| SIGTRAP | 硬件故障 |
| SIGXCPU | 超出CPU限制(setrlimit) |
| SIGXFSZ | 超过文件长度限制(setrlimit) |
造成程序dump的原因有很多,以下为一些常见的原因:
- 内存访问越绝
- 多线程程序使用了线程不安全的函数
- 多线程读写数据未加锁保护
- 非法指针
- 空指针
- 非法指针转换
- 堆栈溢出
linux默认不生成core文件,开启core文件生成功能有以下3种方法:
-
将语句
ulimit -c unlimited写入/etc/profile里,source之后永久生效 -
cd到程序目录,输入
ulimit -c unlimited命令,在当前终端生效 -
在代码里面使用
setrlimit函数设置生成core文件,例:#include<sys/resource.h> ... struct rlimit limit; limit.rlim_cur = RLIM_INFINITY; limit.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &limit); ...
使用以下命令来配置core文件属性:
-
查看core文件生成功能是否开启
ulimit -c # 如果为0表示core文件生成功能已关闭
-
限制core文件大小
ulimit -c fsize #fsize文件大小(单位:kbyte)
-
取消core文件大小限制
ulimit -c unlimited
使用以下命令来设置core文件的生成目录和命名:
-
linux
echo "/xx/core.%e.%p" > /proc/sys/kernel/core_pattern #xx:core文件生成路径 # 如果echo无效,使用以下命令 sysctl -w "kernel.core_pattern=/xx/core.%e.%p" > /dev/null #xx:core文件生成路径
-
macos
echo "/path/core.%e.%p" >> /core/core.pid #path:core文件生成路径
core.%e.%p是core文件的命名规则,各参数说明如下:
| 参数 | 含义 |
|---|---|
%p |
添加pid |
%u |
添加当前uid |
%g |
添加当前gid |
%s |
添加导致产生core的信号 |
%t |
添加core文件生成的unix时间 |
%h |
添加主机名 |
%e |
添加命令名 |
sleep 15
# 按下Ctrl + \linux/windows下都有各自的dump捕获函数,也可以通过使用跨平台崩溃捕获工具:开发工具#BreakPad, CrashPad来捕获。
linux下使用以下命令判断一个文件是否是dump文件:
-
readelf -h xx例:
TODO
Windows略。
# 使用gdb打开
gdb test xx # xx:c
# 查看堆栈信息
bt
# 查看出错位置
where
# 切换堆栈信息
f(xx) # xx:堆栈层数(1:一般是main函数, ...)参考:开发工具#分析dump文件#通过Windbg分析dump文件
TODO
TODO
linux:
/var/log/message:系统服务及日志,包括服务的信息,报错等/var/log/secure:系统登录日志(系统认证信息日志)/var/log/cron:定时任务日志/var/log/maillog:邮件日志/var/log/boot.log:系统启动日志/var/log/wtmp:永久记录每个用户登陆,注销及系统的启动,停机事件
windows:
略
Linux:
auth:pam产生的日志authpriv:ssh,ftp等登陆信息验证信息cron:时间任务相关kern:内核lpr:打印mail:邮件mark(syslog)-rsyslog:服务内部的信息,时间标识news:新闻组user:用户程序产生的相关信息uucp:unix to unix copy,unix主机之间相关的通讯local 1~7:自定义的日志设备
windows:
略
Linux:
debug:调试信息info:一般信息notice:通知warning:警告级别err:错误级别crit:严重级别alert:需要立即修改的信息emerg:内核崩溃none:无
windows:
略
系统日志的配置文件在:
-
linux
/etc/rsyslog.conf -
macos
/etc/syslog.conf
-
linux
systemctl restart rsyslog
-
Windows
略