Core 产生的原因
- 内存访问越界
- 多线程程序使用了线程不安全的函数。
- 多线程读写的数据未加锁保护
- 非法指针
- 堆栈溢出
如何生成 Core
ulimit -c unlimited
echo "/xxx/xx/core-%e-%p-%s-%t" > /proc/sys/kernel/core_pattern
默认core文件生成在当前路径,可以修改路径
%p 出Core进程的PID
%u 出Core进程的UID
%s 造成Core的signal号
%t 出Core的时间,从1970-01-0100:00:00开始的秒数
%e 出Core进程对应的可执行文件名
如何分析 core
前提是编译的 debug 版本库
命令行输入
gdb 可执行文件 core文件
功能 | 命令 | 示例 |
---|---|---|
查看堆栈信息 | bt | |
查看某一层的堆栈信息 | frame , f | f 0 表示打印栈顶,f 1 表示打印栈的第二层, 此时可以打印这一层的局部变量,变量地址等,如 p 变量名 |
上移一层 | up | |
下移一层 | down | |
查看当前栈层的信息 | frame,f 会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句 | info frame, info f, 会打印出更为详细的当前栈层的信息 |
打印当前函数的参数名及其值 | info args | |
打印出当前函数中所有局部变量及其值 | info locals | |
打印出当前的函数中的异常处理信息 | info catch | |
设置符号(库)文件搜索路径的前缀 | set solib-absolute-prefix /mnt/test/lib | 只能有一个,它与 set sysroot等价 |
设置符号(库)文件搜索路径 | set solib-search-path /mnt/test/lib | 可以有多个,用":"隔开 |
设置环境变量 | set env LD_LIBRARY_PATH /tmp |
参考
core文件如何分析
Linux中用gdb 查看代码堆栈的信息
solib-absolute-prefix 和solib-search-path的区别
gdb 查找动态库方法