如何生成coredump文件
生成方法如下:
1、工具需求
(1)iar平台
2、第一种方法:首先在工程选项options里面,选中output converter选项,接着勾中Generate additional output选项,
(1)然后在Output format 里选中Intel extended选项,继续在Output file 下面勾上Override default就完成,在Exe文件夹里就有×××.hex,效果如图所示。
3、第二种方法:先打开IAR的工程选项,紧接着选中左边栏中的Linker,在右边的选项卡中选中第一项output。
(1)此时勾中Output file下的选项,并将输出文件名后辍改为.hex,
(2)最后在Format选项框中选中Other,Output 后 选择inter-extneded其他的值保持默认,hex文件就生成了,如图。
在linux平台下,设置core dump文件生成的方法:
1 )如何生成 coredump 文件
登陆 LINUX 服务器,任意位置键入
echo "ulimit -c 1024" >> /etc/profile
退出 LINUX 重新登陆 LINUX
键入 ulimit -c
如果显示 1024 那么说明 coredump 已经被开启。
1024 限制产生的 core 文件的大小不能超过 1024kb,可以使用参数unlimited,取消该限制
ulimit -c unlimited
2 ) . core 文件的简单介绍
在一个程序崩溃时,它一般会在指定目录下生成一个 core 文件。 core 文件仅仅是一个内存映象 ( 同时加上调试信息 ) ,主要是用来调试的。
3 ) . 开启或关闭 core 文件的生成
用以下命令来阻止系统生成 core 文件 :
ulimit -c 0
下面的命令可以检查生成 core 文件的选项是否打开 :
ulimit -a
该命令将显示所有的用户定制,其中选项 -a 代表“ all ”。
也可以修改系统文件来调整 core 选项
在 /etc/profile 通常会有这样一句话来禁止产生 core 文件,通常这种设置是合理的 :
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
但是在开发过程中有时为了调试问题,还是需要在特定的用户环境下打开 core 文件产生的设置。
在用户的 ~/.bash_profile 里加上 ulimit -c unlimited 来让特定的用户可以产生 core 文件。
如果 ulimit -c 0 则也是禁止产生 core 文件,而 ulimit -c 1024 则限制产生的 core 文件的大小不能超过 1024kb
4 ) . 设置 Core Dump 的核心转储文件目录和命名规则
/proc/sys/kernel/core_uses_pid 可以控制产生的 core 文件的文件名中是否添加 pid 作为扩展 ,如果添加则文件内容为 1 ,否则为 0
proc/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 coredump into the filename 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
6 ) . 一个小方法来测试产生 core 文件
直接输入指令 :
kill -s SIGSEGV $$
发生coredump一般都是在进程收到某个信号的时候,Linux上现在大概有60多个信号,可以使用 kill -l 命令全部列出来。
针对特定的信号,应用程序可以写对应的信号处理函数。如果不指定,则采取默认的处理方式, 默认处理是coredump的信号如下:
3)SIGQUIT 4)SIGILL 6)SIGABRT 8)SIGFPE 11)SIGSEGV 7)SIGBUS 31)SIGSYS
5)SIGTRAP 24)SIGXCPU 25)SIGXFSZ 29)SIGIOT
我们看到SIGSEGV在其中,一般数组越界或是访问空指针都会产生这个信号。另外虽然默认是这样的,但是你也可以写自己的信号处理函数改变默认行为。
上述内容只是产生coredump的必要条件,而非充分条件。要产生core文件还依赖于程序运行的shell,可以通过ulimit -a命令查看
查看 error log:
我们拿到了崩溃位置0xee36f1,如何找到与之相对的代码位置呢?
找台测试机,获取对应版本的安装包:
解压:
然后用 GDB 打开 mysqld:
在 0xee36f1 位置打一个断点:
我们可以看到,gdb 将崩溃位置的文件名和行号都打印出来,
剩下的事情,就可以交给开发工程师,按照这个崩溃堆栈来进行问题排查。
赠送章节
红框内的这串信息是什么?我们来解开看一下,
这段信息分为两段,"+0x71" 是一个偏移量,前面是一串文字,我们将文字解析出来:
可以看到前面这串文字是一个函数签名的编码,用 c++filt 还原编码以后,可以看到完整的函数签名。
红框内的这串信息的意思就是崩溃位置是 一个函数起始位置 + 偏移量。
我们大概可以猜到,这个 MySQL 的缺陷是在为 binlog 产生新的文件名时发生的。
小贴士:
函数起始位置 + 偏移量 是一种内存位置的表示方法,但该位置不一定是这个函数内的代码。
以本例来说,0xee36f1 这个位置,程序找到了就近的函数 generate_new_name 的起始位置,计算出有 0x71 这么多偏移,就表示成了 generate_new_name+0x71 这种形式。
但 0xee36f1 这个位置的代码,大概率是,但,不一定是 generate_new_name 这个函数内部的一段代码。
使用C/C++语言开发程序时,当程序crash的时候产生core dump文件对于调试程序是很有帮助的。在Redhat Linux系统中默认是不生成core dump文件的,这是因为在/etc/profile文件中有这样一行
ulimit -S -c 0 /dev/null 2&1
第一种方法是修改/etc/profile,把ulimit那一行改为
ulimit -S -c unlimited /dev/null 2&1
这样设置后系统允许所有用户生成没有大小限制的core dump文件。这样做的优点是不需要重起系统,缺点是无法控制只让某些用户生成core dump文件。
* soft core 0
如果只想对某些用户或用户组打开core dump,可以加入
user soft core 0或@group soft core 0
注意如果通过修改/etc/security/limits.conf文件打开core dump,还需要注释掉/etc/profile中的ulmit那一行
#ulimit -S -c 0 /dev/null 2&1
这样修改的优点是可以针对特定用户或特定组打开core dump文件,缺点是需要重起系统。
最后说一下生成core dump文件的位置,默认位置与可执行程序在同一目录下,文件名是core.***,其中***是一个数字。core dump文件名的模式保存在/proc/sys/kernel/core_pattern中,缺省值是core。通过以下命令可以更改core dump文件的位置(如希望生成到/tmp/cores目录下)
易邢亮菌: 使用C/C++语言开发程序时,当程序crash的时候产生core dump文件对于调试程序是很有帮助的.在Redhat Linux系统中默认是不生成core dump文件的,这是因为在/etc/profile文件中有这样一行 ulimit -S -c 0 /dev/null 2&1 第一种方法是修改/etc/...
曲阳县19680447642: 在windows下如何生成类似于linux下的coredump文件 - ?
易邢亮菌:在任务管理器中可以生成转储文件,参考下图
曲阳县19680447642: 如何手动生成dump文件 - ?
易邢亮菌: 手动coredump状态:连接gdb-gcorepid终端发送signal终止process:kill-ssignalpid自然发送能产生coredump的signal,前文有记录,但是有时一次还杀不掉processsignal可以被忽视.
曲阳县19680447642: 请问怎么才能让linux一直能产生coredump文件呢? - ?
易邢亮菌: 在Linux上只要打开core dump文件开关,当程序crash时系统生成相应的core文件.下面是简单的一些步骤:1.查看当前是否已经打开了此开关 通过命令:ulimit -c 如果输出为 0 ,则代表没有打开.如果为unlimited则已经打开了,就没必要在做打...
曲阳县19680447642: 怎么设置core文件的产生目录 - ?
易邢亮菌: 一共四个目录,设置依次如下:1、工作目录:(这个是设置你的工作文件放在那个文件夹的路径,比如你工作路径是D盘/新建文件夹,那么你直接设置到这里就行了)2、矢量字库目录:这个一般都是系统默认的,一般不需要设置.一般都是设置在C:\MAPGIS67\CLIB3、系统库目录:这个一般都是系统默认的,一般不需要设置.一般都是设置在C:\MAPGIS67\SLIB4、系统临时目录:这个一般都是系统默认的,一般不需要设置.一般都是设置在C:\MAPGIS67\TEMP.
曲阳县19680447642: 什么是Core Dump?怎么使用? - ?
易邢亮菌: 开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为...
曲阳县19680447642: 怎么查看Linux的core开关,以及如何打开和关闭 - ?
易邢亮菌: dump文件可以在程序crash时,方便我们查看程序crash的地方和上下文信息.在window下,要能生成dump文件,需要自己编写相应的代码.不过现在网上可以找到相应的代码,只要把它下载后然后加到自己的工程中去,就可以了!在linux下面...
曲阳县19680447642: window上如何设置才能获取dump文件 - ?
易邢亮菌: 第一步丶打开电脑的dump文件存储功能. 在“我的电脑”上右键——属性——高级,选好后点确定,下次再出现蓝屏时,系统就会存储下dump文件,一般存放位置在系统盘的minidump文件夹下.(建议在该文件夹上点右键——属性——发送...
曲阳县19680447642: linux程序怎么生成core - ?
易邢亮菌: 在Linux上只要打开core dump文件开关,当程序crash时系统生成相应的core文件.下面是简单的一些步骤: 1.查看当前是否已经打开了此开关 通过命令:ulimit -c 如果输出为 0 ,则代表没有打开.如果为unlimited则已经打开了,就没必要在做打开.
曲阳县19680447642: 系统无法生成core dump 是怎么回事 - ?
易邢亮菌: 在Redhat Linux系统中默认是不生成core dump文件的,这是因为在/etc/profile文件中有这样一行 ulimit -S -c 0 /dev/null 2&1 第一种方法是修改/etc/profile,把ulimit那一行改为 ulimit -S -c unlimited /dev/null 2&1 这样设置后系统允许所有用户生成没...