如何使用coredump
一、coredump
当用户态进程出现异常后,在该进程的执行目录下生成对应的coredump文件,如果我们想将coredump生成的位置做改变,就需要如下设置。
- echo "/home/core-%e-%p-%u-%g-%t" > /proc/sys/kernel/core_pattern
- echo 0x000003ff >/proc/self/coredump_filter
- ulimit -c unlimited (修改profile文件)
- source /etc/profile
- %%:相当于%
- %p:相当于<pid>
- %u:相当于<uid>
- %g:相当于<gid>
- %s:相当于导致dump的信号的数字
- %t:相当于dump的时间
- %e:相当于执行文件的名称
- %h:相当于hostname
常用的分析coredump的命令有:
bt(打印调用栈),f num(查看某一个frame的调用栈),disassemble 0x000000000040b9f0 (disassemble 地址,查看对应地址的反汇编),i r(查看寄存器的内容),p *(struct link_map*)0x7fab515ff690(查看结构体信息),x /40xb 0x7fab515ff690(查看某个地址的存储值)
info proc mappings
- (gdb) info proc mappings 查看proc maps
- Mapped address spaces:
- Start Addr End Addr Size Offset objfile
- 0x400000 0x410000 0x10000 0x0 /usr/bin/sysmonitor
- 0x60f000 0x610000 0x1000 0xf000 /usr/bin/sysmonitor
- 0x610000 0x611000 0x1000 0x10000 /usr/bin/sysmonitor
- 0x7fab509ee000 0x7fab50ba4000 0x1b6000 0x0 /usr/lib64/libc-2.17.so
- 0x7fab50ba4000 0x7fab50da3000 0x1ff000 0x1b6000 /usr/lib64/libc-2.17.so
- 0x7fab50da3000 0x7fab50da7000 0x4000 0x1b5000 /usr/lib64/libc-2.17.so
- 0x7fab50da7000 0x7fab50da9000 0x2000 0x1b9000 /usr/lib64/libc-2.17.so
- 0x7fab50dae000 0x7fab50daf000 0x1000 0x0 /usr/lib64/libalarm.so
- 0x7fab50daf000 0x7fab50faf000 0x200000 0x1000 /usr/lib64/libalarm.so
- 0x7fab50faf000 0x7fab50fb0000 0x1000 0x1000 /usr/lib64/libalarm.so
info files
- (gdb) info files
- Symbols from "/home/sysmonitor".
- Local core dump file:
- `/home/core.sysmonitor_98927_1468144735', file type elf64-x86-64.
- 0x0000000000400000 - 0x0000000000410000 is load1
- 0x000000000060f000 - 0x0000000000610000 is load2
- 0x0000000000610000 - 0x0000000000611000 is load3
- 0x0000000000611000 - 0x0000000000644000 is load4
- 0x00000000023c0000 - 0x00000000023e1000 is load5
- 0x00007fab3c000000 - 0x00007fab3c021000 is load6
- 0x00007fab3c021000 - 0x00007fab40000000 is load7
- 0x00007fab44000000 - 0x00007fab44021000 is load8
- 0x00007fab44021000 - 0x00007fab48000000 is load9
- 0x00007fab4a9e2000 - 0x00007fab4a9e3000 is load10
- 0x00007fab4a9e3000 - 0x00007fab4b1e3000 is load11
- 0x00007fab4b1e3000 - 0x00007fab4b1e4000 is load12
- 0x00007fab4b1e4000 - 0x00007fab4b9e4000 is load13
- 0x00007fab50da3740 - 0x00007fab50da3748 is .init_array in /usr/lib64/libc.so.6
- 0x00007fab50da3748 - 0x00007fab50da3838 is __libc_subfreeres in /usr/lib64/libc.so.6
- 0x00007fab50da3838 - 0x00007fab50da3840 is __libc_atexit in /usr/lib64/libc.so.6
- 0x00007fab50da3840 - 0x00007fab50da3858 is __libc_thread_subfreeres in /usr/lib64/libc.so.6
- 0x00007fab50da3860 - 0x00007fab50da6b80 is .data.rel.ro in /usr/lib64/libc.so.6
- 0x00007fab50da6b80 - 0x00007fab50da6d70 is .dynamic in /usr/lib64/libc.so.6
- 0x00007fab50da6d70 - 0x00007fab50da6ff0 is .got in /usr/lib64/libc.so.6
gdb使用方法,gdb /usr/bin/cmd(debuginfo的文件,或者带-g选项的) core_xxx
watch *(int*)监控4字节地址 用户态修改
二、dmesg
当用户进程出现coredump时,在messages日志中也会记录异常,尤其是dmesg日志中,比如下面的记录:
- php-fpm22053: segfault at 2559 ip 000000398a6145b2 sp 00007fffad1d4b78 error 4 in ld-2.5.so398a600000+1c000
其实demsg日志,也可以给我们提供一些有效信息,包括段错误的地址0x2559, 指令执行寄存器IP0x 000000398a6145b2, 当前栈地址SP 0x00007fffad1d4b78, 错误号4,以及段错误发生在ld-2.5.so
中。发生在ld-2.5.so 中, 我们没有debug symbol信息,因此无法直接定位段错误在程序的哪一行。但通过IP寄存器, 我们是可以定位到具体的汇编指令的。
- objdump -d /lib64/ld-2.5.so > ld.asm
- 000000398a6145b0 <strcmp>:
- 398a6145b0: 8a 07 mov (%rdi),%al
- 398a6145b2: 3a 06 cmp (%rsi),%al
- 398a6145b4: 75 0d jne 398a6145c3 <strcmp+0x13>
如何使用coredump的更多相关文章
- coredump简介与coredump原因总结
from:http://www.cnblogs.com/doctorqbw/archive/2011/12/21/2295962.html 千兵卫博士 coredump简介与coredump原 ...
- coredump
COREDUMP调试的使用 一,什么是coredump 跑程序的时候经常碰到SIGNAL 或者 call trace的问题,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程 ...
- 转:linux coredump调试
1 )如何生成 coredump 文件 ? 登陆 LINUX 服务器,任意位置键入 echo "ulimit -c 1024" >> /etc/profile 退出 L ...
- 快速学习C语言二: 编译自动化, 静态分析, 单元测试,coredump调试,性能剖析
上次的Hello world算是入门了,现在学习一些相关工具的使用 编译自动化 写好程序,首先要编译,就用gcc就好了,基本用法如下 gcc helloworld.c -o helloworld.o ...
- 动态库在线更新导致coredump的问题
最近我们数据中心主机上的第三方管理工具升级,导致数据中心系统coredump,看起来不相关的事情,到底是怎么回事了? 首先,打开core文件看看: core.45259 is truncated: e ...
- coredump调试的使用
一,什么是coredump 跑程序的时候经常碰到SIGNAL 或者 call trace的问题,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满 ...
- 嵌入式系统coredump设计
阴沟翻船,马失前蹄,说明凡事皆有可能.自然,程序设计的再好,也会有crash的时候.开发期还还说,正式交付的系统crash自然更是难以承受的.无论何时,死一次就够了,得有方法查个水落石出. 几年前哥去 ...
- 待整理-coredump
Linux下如何产生coredump(gdb调试用) 任务发生异常,需要记录遗言信息,利用gdb调试,因此需要记录coredump文件.设置查看:在root用户下执行sysctl -a | grep ...
- 无法产生coredump的问题
我写了一个必然会崩溃的程序,名字为 test :#include "stdlib.h"#include "unistd.h" int main(){ char ...
- [转]gdb结合coredump定位崩溃进程
[转]gdb结合coredump定位崩溃进程 http://blog.sina.com.cn/s/blog_54f82cc201013tk4.html Linux环境下经常遇到某个进程挂掉而找不到原因 ...
随机推荐
- 关于Synchronized你了解多少?
1.说一说自己对于 synchronized 关键字的了解 synchronized是解决多线程之间访问资源的同步性,synchronized关键字可以保证被他修饰的资源在任何时刻只有一个线程访问. ...
- Java中==、equals、hashCode的区别
"=="是运算符,用来比较两个值.两个对象的内存地址是否相等: "equals"是Object类的方法,默认情况下比较两个对象是否是同一个对象,内部实现是通过& ...
- P1015 [NOIP1999 普及组] 回文数
点击查看题目 题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个十进制数 5656,将 5656 加 6565(即把 5656 从右向左读),得到 ...
- Solution -「NOI 2020」「洛谷 P6776」超现实树
\(\mathcal{Description}\) Link. 对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...
- VUE3 之 动画与过渡的实现 - 这个系列的教程通俗易懂,适合新手
1. 概述 光环效应告诉我们: 当一个人在某一方面取得了巨大的成功,人们就会给他贴上正面的标签,这个人从此就被"优秀"的光环所笼罩,他做的一切,人们都认为是正确的. 例如:越是名气 ...
- spring IOC的理解,原理与底层实现?
从总体到局部 总 控制反转:理论思想,原来的对象是由使用者来进行控制,有了spring之后,可以把整个对象交给spring来帮我们进行管理 DI(依赖注入):把对应的属性 ...
- Visual Studio Code 配置C、C++ 文件debug调试环境
目录 vscode C/C++ Extension Pack 插件安装 vscode windows 端 debug 配置 window MinGW 环境安装 windows 端 C.CPP 单文件 ...
- python-xlutils模块-修改excel
前言 xlrd库用于读取excel文件中的数据,xlwt库用于将数据写入excel文件,修改用xlutils模块: xlutils库也仅仅是通过复制一个副本进行操作后保存一个新文件,像是xlrd库和x ...
- 编写资源yaml文件、压力机配置hosts
资源文件 Deployment/StatefulSet/DaemonSet.Service.Ingress等 参考:https://www.cnblogs.com/uncleyong/p/155710 ...
- windows加普通用户加入管理员组
net localgroup administrators 用户名 /add ------------>使用这句命令添加用户到管理组 shutdown -g 重启电脑