linuxdump文件怎么打开|如何手工抓取dump文件及分析

linuxdump文件怎么打开|如何手工抓取dump文件及分析的第1张示图

A. linux mp命令

mp命令用于备份ext2或者ext3文件系统。可将目录或整个文件系统备份至指定的设备,或备份成一个大文件。命令格式:mp [选项] [参数] 需要备份的文件常用选项即参数:-[0-9]:备份的层级-f 设备名称:指定备份设备;-u:备份完毕后,在/etc/mpdates中记录备份的文件系统、层级、日期与时间等用法示例:将/home目录所有内容备份到/tmp/homeback.bak文件中,备份层级为0并在/etc/mpdates中记录相关信息:$ mp -0u -f /tmp/homeback.bak /home 将/home目录所有内容备份到/tmp/homeback.bak文件中,备份层级为1(只备份上次使用层次0备份后发生过改变的数据)并在/etc/mpdates中记录相关信息:$ mp -1u -f /tmp/homeback.bak /home 通过mp命令的备份层级,可实现完整+增量备份、完整+差异备份,在配合crontab可以实现无人值守备份。

B. 怎么看linux内核 mp文件

Core,又称之为Core Dump文件,是Unix/Linux操作系统的一种机制,对于线上服务而言,Core令人闻之色变,因为出Core的过程意味着服务暂时不能正常响应,需要恢复,并且随着吐Core进程的内存空间越大,此过程可能持续很长一段时间(例如当进程占用60G+以上内存时,完整Core文件需要15分钟才能完全写到磁盘上),这期间产生的流量损失,不可估量。凡事皆有两面性,OS在出Core的同时,虽然会终止掉当前进程,但是也会保留下第一手的现场数据,OS仿佛是一架被按下快门的相机,而照片就是产出的Core文件。里面含有当进程被终止时内存、CPU寄存器等信息,可以供后续开发人员进行调试。 关于Core产生的原因很多,比如过去一些Unix的版本不支持现代Linux上这种GDB直接附着到进程上进行调试的机制,需要先向进程发送终止信号,然后用工具阅读core文件。在Linux上,我们就可以使用kill向一个指定的进程发送信号或者使用gcore命令来使其主动出Core并退出。如果从浅层次的原因上来讲,出Core意味着当前进程存在BUG,需要程序员修复。从深层次的原因上讲,是当前进程触犯了某些OS层级的保护机制,逼迫OS向当前进程发送诸如SIGSEGV(即signal 11)之类的信号, 例如访问空指针或数组越界出Core,实际上是触犯了OS的内存管理,访问了非当前进程的内存空间,OS需要通过出Core来进行警示,这就好像一个人身体内存在病毒,免疫系统就会通过发热来警示,并导致人体发烧是一个道理(有意思的是,并不是每次数组越界都会出Core,这和OS的内存管理中虚拟页面分配大小和边界有关,即使不出Core,也很有可能读到脏数据,引起后续程序行为紊乱,这是一种很难追查的BUG)。说了这些,似乎感觉Core很强势,让人感觉缺乏控制力,其实不然。控制Core产生的行为和方式,有两个途径:1.修改/proc/sys/kernel/core_pattern文件,此文件用于控制Core文件产生的文件名,默认情况下,此文件内容只有一行内容:“core”,此文件支持定制,一般使用%配合不同的字符,这里罗列几种:%p 出Core进程的PID%u 出Core进程的UID%s 造成Core的signal号%t 出Core的时间,从1970-01-0100:00:00开始的秒数%e 出Core进程对应的可执行文件名2.Ulimit –C命令,此命令可以显示当前OS对于Core文件大小的限制,如果为0,则表示不允许产生Core文件。如果想进行修改,可以使用:Ulimit –cn其中n为数字,表示允许Core文件体积的最大值,单位为Kb,如果想设为无限大,可以执行:Ulimit -cunlimited产生了Core文件之后,就是如何查看Core文件,并确定问题所在,进行修复。为此,我们不妨先来看看Core文件的格式,多了解一些Core文件。首先可以明确一点,Core文件的格式ELF格式,这一点可以通过使用readelf -h命令来证实,如下图: 从读出来的ELF头信息可以看到,此文件类型为Core文件,那么readelf是如何得知的呢?可以从下面的数据结构中窥得一二: 其中当值为4的时候,表示当前文件为Core文件。如此,整个过程就很清楚了。了解了这些之后,我们来看看如何阅读Core文件,并从中追查BUG。在Linux下,一般读取Core的命令为:gdb exec_file core_file使用GDB,先从可执行文件中读取符号表信息,然后读取Core文件。如果不与可执行文件搅合在一起可以吗?答案是不行,因为Core文件中没有符号表信息,无法进行调试,可以使用如下命令来验证:Objmp –x core_file | tail我们看到如下两行信息:SYMBOL TABLE:no symbols表明当前的ELF格式文件中没有符号表信息。为了解释如何看Core中信息,我们来举一个简单的例子:#include “stdio.h”int main(){int stack_of[100000000];int b=1;int* a;*a=b;}这段程序使用gcc –g a.c –o a进行编译,运行后直接会Core掉,使用gdb a core_file查看栈信息,可见其Core在了这行代码:int stack_of[100000000];原因很明显,直接在栈上申请如此大的数组,导致栈空间溢出,触犯了OS对于栈空间大小的限制,所以出Core(这里是否出Core还和OS对栈空间的大小配置有关,一般为8M)。但是这里要明确一点,真正出Core的代码不是分配栈空间的int stack_of[100000000], 而是后面这句int b=1, 为何?出Core的一种原因是因为对内存的非法访问,在上面的代码中分配数组stack_of时并未访问它,但是在其后声明变量并赋值,就相当于进行了越界访问,继而出Core。为了解释得更详细些,让我们使用gdb来看一下出Core的地方,使用命令gdb a core_file可见: 可知程序出现了段错误“Segmentation fault”, 代码是int b=1这句。我们来查看一下当前的栈信息: 其中可见指令指针rip指向地址为0×400473, 我们来看下当前的指令是什么: 这条movl指令要把立即数1送到0xffffffffe8287bfc(%rbp)这个地址去,其中rbp存储的是帧指针,而0xffffffffe8287bfc很明显是一个负数,结果计算为-400000004。这就可以解释了:其中我们申请的int stack_of[100000000]占用400000000字节,b是int类型,占用4个字节,且栈空间是由高地址向低地址延伸,那么b的栈地址就是0xffffffffe8287bfc(%rbp),也就是$rbp-400000004。当我们尝试访问此地址时: 可以看到无法访问此内存地址,这是因为它已经超过了OS允许的范围。下面我们把程序进行改进:#include “stdio.h”int main(){int* stack_of = malloc(sizeof(int)*100000000);int b=1;int* a;*a=b;}使用gcc –O3 –g a.c –o a进行编译,运行后会再次Core掉,使用gdb查看栈信息,请见下图: 可见BUG出在第7行,也就是*a=b这句,这时我们尝试打印b的值,却发现符号表中找不到b的信息。为何?原因在于gcc使用了-O3参数,此参数可以对程序进行优化,一个负面效应是优化过程中会舍弃部分局部变量,导致调试时出现困难。在我们的代码中,b声明时即赋值,随后用于为*a赋值。优化后,此变量不再需要,直接为*a赋值为1即可,如果汇编级代码上讲,此优化可以减少一条MOV语句,节省一个寄存器。此时我们的调试信息已经出现了一些扭曲,为此我们重新编译源程序,去掉-O3参数(这就解释了为何一些大型软件都会有debug版本存在,因为debug是未经优化的版本,包含了完整的符号表信息,易于调试),并重新运行,得到新的core并查看,如下图: 这次就比较明显了,b中的值没有问题,有问题的是a,其指向的地址是非法区域,也就是a没有分配内存导致的Core。当然,本例中的问题其实非常明显,几乎一眼就能看出来,但不妨碍它成为一个例子,用来解释在看Core过程中,需要注意的一些问题。

C. 如何让linux生成内存mp

在Linux上只要打开core mp文件开关,当程序crash时系统生成相应的core文件。下面是简单的一些步骤:1.查看当前是否已经打开了此开关通过命令:ulimit -c 如果输出为 0 ,则代表没有打开。如果为unlimited则已经打开了,就没必要在做打开。2.通过命令打开ulimit -c unlimited .然后通过步骤1,可以监测是否打开成功。3.如果你要取消,很简单:ulimit -c 0 就可以了通过上面的命令修改后,一般都只是对当前会话起作用,当你下次重新登录后,还是要重新输入上面的命令,所以很麻烦。我们可以把通过修改 /etc/profile文件 来使系统每次自动打开。步骤如下:1.首先打开/etc/profile文件一般都可以在文件中找到 这句语句:ulimit -S -c 0 > /dev/null 2>&1.ok,根据上面的例子,我们只要把那个0 改为 unlimited 就ok了。然后保存退出。2.通过source /etc/profile 使当期设置生效。3.通过ulimit -c 查看下是否已经打开。其实不光这个命令可以加入到/etc/profile文件中,一些其他我们需要每次登录都生效的都可以加入到此文件中,因为登录时linux都会加载此文件。比如一些环境变量的设置。还有一种方法可以通过修改/etc/security/limits.conf文件来设置,这个方法没有试过,也是网上看到。不过上面两种就可以了!最后说一下生成core mp文件的位置,默认位置与可执行程序在同一目录下,文件名是core.***,其中***是一个数字。core mp文件名的模式保存在/proc/sys/kernel/core_pattern中,缺省值是core。通过以下命令可以更改core mp文件的位置(如希望生成到/tmp/cores目录下)echo “/tmp/cores/core” > /proc/sys/kernel/core_pattern设置完以后我们可以做个测试,写个程序,产生一个异常。然后看到当前目录会有个core*的文件。

D. 请问怎么才能让linux一直能产生coremp文件呢

在Linux上只要打开core mp文件开关,当程序crash时系统生成相应的core文件。下面是简单的一些步骤:1.查看当前是否已经打开了此开关 通过命令:ulimit -c 如果输出为 0 ,则代表没有打开。如果为unlimited则已经打开了,就没必要在做打开。2.通过命令打开 ulimit -c unlimited .然后通过步骤1,可以监测是否打开成功。3.如果你要取消,很简单:ulimit -c 0 就可以了通过上面的命令修改后,一般都只是对当前会话起作用,当你下次重新登录后,还是要重新输入上面的命令,所以很麻烦。我们可以把通过修改 /etc/profile文件 来使系统每次自动打开。步骤如下:1.首先打开/etc/profile文件一般都可以在文件中找到 这句语句:ulimit -S -c 0 > /dev/null 2>&1.ok,根据上面的例子,我们只要把那个0 改为 unlimited 就ok了。然后保存退出。2.通过source /etc/profile 使当期设置生效。3.通过ulimit -c 查看下是否已经打开。其实不光这个命令可以加入到/etc/profile文件中,一些其他我们需要每次登录都生效的都可以加入到此文件中,因为登录时linux都会加载此文件。比如一些环境变量的设置。还有一种方法可以通过修改/etc/security/limits.conf文件来设置,这个方法没有试过,也是网上看到。不过上面两种就可以了! 最后说一下生成core mp文件的位置,默认位置与可执行程序在同一目录下,文件名是core.***,其中***是一个数字。core mp文件名的模式保存在/proc/sys/kernel/core_pattern中,缺省值是core。通过以下命令可以更改core mp文件的位置(如希望生成到/tmp/cores目录下)echo “/tmp/cores/core” > /proc/sys/kernel/core_pattern 设置完以后我们可以做个测试,写个程序,产生一个异常。然后看到当前目录会有个core*的文件。

E. linux下java mp文件在哪儿

如果所使用的应用服务器是tomact,mp文件默认在catalina.out日志文件里;如果不是则可以查看java环境变量设置的位置,也就知道在mp文件的位置了;如果没有生成mp文件或者是生成错误,请按照一下几种方法来修复:系统默认的core文件生成路径是 /var/logs,但是 /var/logs 目录并非系统自带的,系统初始安装默认自带的是/var/log,最终导致该系统出现core mp后并没能生成core文件,因此如何查询和修改系统默认的core mp文件生产路径呢?方法如下:一. 查询core mp文件路径:方法1:# cat /proc/sys/kernel/core_pattern方法2:# /sbin/sysctl kernel.core_pattern二. 修改core mp文件路径:方法1:临时修改:修改/proc/sys/kernel/core_pattern文件,但/proc目录本身是动态加载的,每次系统重启都会重新加载,因此这种方法只能作为临时修改。/proc/sys/kernel/core_pattern例:echo ‘/var/log/%e.core.%p’ > /proc/sys/kernel/core_pattern方法2:永久修改:使用sysctl -w name=value命令。例:/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p

F. 如何手工抓取mp文件及分析

当服务器挂起,崩溃或者性能底下时,就需要抓取服务器的线程堆栈(Thread Dump)用于后续的分析.Thread mp提供了当前活动的线程的快照. 它提供了JVM中所有Java线程的栈跟踪信息有很多方式可用于获取Thread Dump, 一些是操作系统特定的命令.操作系统命令获取ThreadDump:Windows:1. 转向服务器的标准输出窗口并按下Control + Break组合键, 之后需要将线程堆栈复制到文件中UNIX/ Linux首先查找到服务器的进程号(process id), 然后获取堆栈.1. ps –ef | grep java2. kill -3 <pid>注意一定要谨慎, 一步不慎就可能让服务器进程被杀死! JVM 自带的工具获取线程堆栈:JDK自带命令行工具获取PID并做ThreadDump:1. jps2. jstack <pid>使用JVisualVM:Threads 标签页àThreadDump按钮.WebLogic 自带的获取 thread mp的工具:1. webLogic.Admin 工具a. 打开命令提示符, 通过运行<DOMAIN_HOME>/bin/setDomain.env设置相关类路径b. 执行下面的命令java weblogic.Admin -url t3://localhost:7001 -username weblogic -password weblogic1 THREAD_DUMP注意: Thread Dump 会打印到标准输出, 如nohup日志或者进程窗口.2. 使用 Admin Consolea. 登录 Admin Console , 点击对应的服务器b. 点击Server à Monitoring àThreadsc. 点击: Dump Thread Stack 按钮3. 使用WLST (WebLogic Scripting Tool)connect(‘weblogic’,'weblogic1’,’t3://localhost:7001’)cd(‘Servers’)cd(‘AdminServer’)threadDump()disconnect()exit()注意: 线程堆栈将会保存在运行wlst的当前目录下.4. 使用utils.ThreadDumper用法:C:\bea\wlserver_10.3\server\lib>java -cp weblogic.jar utils.ThreadDumperBroadcast Thread mps disabled: must specify weblogic.debug.mpThreadAddr andweblogic.debug.mpThreadPortException in thread "main" java.lang.I llegalArgumentException: Port out of range:-1at java.net.DatagramPacket.setPort(Unknown Source)at java.net.DatagramPacket.<init>(Unknown Source)at java.net.DatagramPacket.<init>(Unknown Source)at utils.ThreadDumper.sendDumpMsg(ThreadDumper.java:124)at utils.ThreadDumper.main(ThreadDumper.java:145)5. 如果服务器是作为Windows服务的方式运行, 请运行下列命令:WL_HOME\bin\beasvc -mp -svcname:service-name

G. linux java mp 怎么查看

在jdk目录下的bin目录里面有个jmap命令,用jmap -mp可以生成mp文件

H. 如何解析 linux minimp文件

小存储器抄转储文件MiniDump 小存储袭器转储文件记录可帮助确定计算机为什么意外停止的最小的有用信息集。此选项要求启动卷上有一个至少为 2 MB 的页面文件。在运行 Microsoft Windows 2000 或更高版本的计算机上,计算机每次意外停止时 Windows 都…

I. RedHat Linux下如何生成core mp文件

在linux平台下,设置core mp文件生成的方法:1 )如何生成 coremp 文件登陆 LINUX 服务器,任意位置键入 echo "ulimit -c 1024" >> /etc/profile退出 LINUX 重新登陆 LINUX键入 ulimit -c如果显示 1024 那么说明 coremp 已经被开启。1024 限制产生的 core 文件的大小不能超过 1024kb,可以使用参数unlimited,取消该限制ulimit -c unlimited2 ) . core 文件的简单介绍在一个程序崩溃时,它一般会在指定目录下生成一个 core 文件。 core 文件仅仅是一个内存映象 ( 同时加上调试信息 ) ,主要是用来调试的。3 ) . 开启或关闭 core 文件的生成用以下命令来阻止系统生成 core 文件 :ulimit -c 0下面的命令可以检查生成 core 文件的选项是否打开 :ulimit -a该命令将显示所有的用户定制,其中选项 -a 代表“ all ”。也可以修改系统文件来调整 core 选项在 /etc/profile 通常会有这样一句话来禁止产生 core 文件,通常这种设置是合理的 :# No core files by defaultulimit -S -c 0 > /dev/null 2>&1但是在开发过程中有时为了调试问题,还是需要在特定的用户环境下打开 core 文件产生的设置。在用户的 ~/.bash_profile 里加上 ulimit -c unlimited 来让特定的用户可以产生 core 文件。如果 ulimit -c 0 则也是禁止产生 core 文件,而 ulimit -c 1024 则限制产生的 core 文件的大小不能超过 1024kb4 ) . 设置 Core Dump 的核心转储文件目录和命名规则/proc/sys/kernel/core_uses_pid 可以控制产生的 core 文件的文件名中是否添加 pid 作为扩展 ,如果添加则文件内容为 1 ,否则为 0proc/sys/kernel/core_pattern 可以设置格式化的 core 文件保存位置或文件名 ,比如原来文件内容是 core-%e可以这样修改 :echo "/corefile/core-%e-%p-%t" > core_pattern将会控制所产生的 core 文件会存放到 /corefile 目录下,产生的文件名为 core- 命令名 -pid- 时间戳以下是参数列表 : %p – insert pid into filename 添加 pid %u – insert current uid into filename 添加当前 uid %g – insert current gid into filename 添加当前 gid %s – insert signal that caused the coremp into the filename 添加导致产生 core 的信号 %t – insert UNIX time that the coremp occurred into filename 添加 core 文件生成时的 unix 时间 %h – insert hostname where the coremp happened into filename 添加主机名 %e – insert coremping executable name into filename 添加命令名6 ) . 一个小方法来测试产生 core 文件直接输入指令 :kill -s SIGSEGV $$发生coremp一般都是在进程收到某个信号的时候,Linux上现在大概有60多个信号,可以使用 kill -l 命令全部列出来。针对特定的信号,应用程序可以写对应的信号处理函数。如果不指定,则采取默认的处理方式, 默认处理是coremp的信号如下:3)SIGQUIT 4)SIGILL 6)SIGABRT 8)SIGFPE 11)SIGSEGV 7)SIGBUS 31)SIGSYS5)SIGTRAP 24)SIGXCPU 25)SIGXFSZ 29)SIGIOT我们看到SIGSEGV在其中,一般数组越界或是访问空指针都会产生这个信号。另外虽然默认是这样的,但是你也可以写自己的信号处理函数改变默认行为。上述内容只是产生coremp的必要条件,而非充分条件。要产生core文件还依赖于程序运行的shell,可以通过ulimit -a命令查看

J. linux mp 文件在哪

您好经过分析发现系统默认的core文件生成路径是/var/logs,但/var/logs目录并非系统自带的,系统初专始安装默认自属带的是/var/log,最终导致该系统出现core mp后并没能生成core文件,因此如何查询和修改系统默认的core mp文件生产路径呢?方法如下:一. 查询core mp文件路径:方法1:# cat /proc/sys/kernel/core_pattern方法2:# /sbin/sysctl kernel.core_pattern二. 修改core mp文件路径:方法1:临时修改:修改/proc/sys/kernel/core_pattern文件,但/proc目录本身是动态加载的,每次系统重启都会重新加载,因此这种方法只能作为临时修改。/proc/sys/kernel/core_pattern例:echo ‘/var/log/%e.core.%p’ > /proc/sys/kernel/core_pattern方法2:永久修改:使用sysctl -w name=value命令。例:/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p

未经允许不得转载:山九号 » linuxdump文件怎么打开|如何手工抓取dump文件及分析

赞 (0)