代码中调用了backtrace等函数后无法生成core文件??

我的系统配置如下:
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 30277
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 65535
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

情况一:程序中没有调用backtrace、backtrace_symbols函数,程序崩溃时候,能生成core文件,
情况二:程序中调用了backtrace、backtrace_symbols函数,程序崩溃时候,不能生成core文件。

请问各路大神,有没有什么办法能够让程序崩溃时候 既能生成core文件,又能在在日志中将崩溃时候的 堆栈信息打印出来(通过调用backtrace、backtrace_symbols函数实现)?

2个回答

补充下我的代码:

以下代码分别注册SIGSEGV信号、SIGABRT信号的信号毁掉函数
signal(SIGSEGV, WidebrightSegvHandler); // SIGSEGV 11

signal(SIGABRT, WidebrightSegvHandler); // SIGABRT 6

以下代码为信号注册函数
static void WidebrightSegvHandler(int signum)
{
void *array[10];
size_t size;
char **strings;
size_t i, j;

signal(signum, SIG_DFL);

size = backtrace (array, 15);
strings = (char **)backtrace_symbols (array, size);

//fprintf(stderr, "widebright received SIGSEGV! Stack trace:\n");
log.info("widebright received SIGSEGV! Stack trace:\n");
for (i = 0; i < size; i++) 
{
    //fprintf(stderr, "%d %s \n",i,strings[i]);
    log.info("%d %s \n",i,strings[i]);
}

free (strings);
exit(1);

}

我猜想是否 是因为我代码中注册了SIGSEGV、SIGABRT的信号函数,
当发生段错误时候,信号SIGSEGV,被我的程序捕获了,系统配置生成core的相关模块没有受到信号SIGSEGV,
因此就产生不了core文件。也就是说说core文件的生成依赖于SIGSEGV信号,没有收到信号就不会产生?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
无法生成core文件
ulimit -c 已经是无限制了,其他程序可以生成core,唯独这个挂掉了不会生成core,这个程序有2个进程,当子进程挂掉了,父进程会产生新的子进程。而且我也把suid_dumpable设置成1了。 求指导!
core文件的生成
ulimit -c unlimited echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
DEDECMS无法>GetOne()无法调用了什么情况
GetOne($sql2);rnecho $row['num'];rnnum是一个字段无法输出
大神们看看,core文件为什么无法生成
在ubuntu下,下面程序能够正常生成core文件rn[code=c]rn#include rnrnint main()rnrn while(1);rn return 0;rnrn[/code]rn编译并执行rn[code=c]rn$gcc -g test.c -o testrn$./test &rn[1] 31032rn$kill -SIGBUS 31032rn[1]+ 总线错误 (核心已转储) ./testrn$ls | grep corerncorern$rn[/code]rn上面程序验证在当前目录下是能够生成core文件的,但是我执行另外一个实际当中我写的程序(程序比较大,就不贴了),执行到一定步骤的时候会提示:rn总线错误(核心已转储)rn但是无论如何我就是找不见core文件存放在哪个位置,本目录下是没有的,后来在网上查找到系统的日志,如下:rn[code=c]rn$sudo cat /var/log/apport.logrnERROR: apport (pid 30996) Wed Nov 27 14:00:22 2013: Unhandled exception:rnTraceback (most recent call last):rn File "/usr/share/apport/apport", line 258, in rn drop_privileges(pid, True)rn File "/usr/share/apport/apport", line 54, in drop_privilegesrn raise ValueError('Invalid process ID: ' + str(e))rnValueError: Invalid process ID: [Errno 2] No such file or directory: '/proc/30994'rnERROR: apport (pid 30996) Wed Nov 27 14:00:22 2013: pid: 30996, uid: 0, gid: 0, euid: 0, egid: 0rnERROR: apport (pid 30996) Wed Nov 27 14:00:22 2013: environment: rn[/code]rn上面的错误信息提示我的程序已经退出了,所以无法生成core文件,请问有大神遇见过这样的问题吗,如何才能生成core文件。rn十分感谢。
追踪谁调用了函数
追踪谁调用了函数 堆栈追踪 StackWalk 追踪谁调用了函数 堆栈追踪 StackWalk
mac生成core文件和生成位置
mac环境的配置方法和linux一样。 通过ulimit来设置是否生成core文件。 生成core文件:ulimit -c unlimited unlimited 也可以换成一个具体的数值,表示生成core的大小不生成core文件:ulimit -c 0 core 文件存储位置 :/core/core.pid
Linux下gdb调试生成core文件并调试core文件
1.什么是core文件?有问题的程序运行后,产生“段错误 (核心已转储)”时生成的具有堆栈信息和调试信息的文件。编译时需要加 -g 选项使程序生成调试信息: gcc -g core_test.c -o core_test2.怎样配置生成 core 文件(1)core文件开关    ①使用 ulimit -c 查看core开关,如果为0表示关闭,不会生成core文件;    ②使用 ulimit -...
生成core文件了!求指点!
smm_agent: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1)- 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long)(old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.rn rn进程名为smm_agent。rn这个是从32位移植到64位上的,只要一运行就会报次错误并生成core文件,用gdb smm_agent ; where ;后显示No Stack。rnrn我也检查了源代码中的malloc和free函数,没有重复使用和释放的现象。 (源码引用了Poco开源库,工程中包含了C和C++的头文件)。rn希望各位大侠帮我分析下,我应该从哪几个方面先入手?可能是代码中的什么问题呢?我现在正从头走读代码,痛苦啊。。。rnrn
win下生成core文件
#ifndef __CCOREMGR__H_ #define __CCOREMGR__H_ #include &quot;singleton.h&quot; #include &quot;CLogmanager.h&quot; #if defined(WIN32) || defined(_WIN32) #include&amp;lt;Windows.h&amp;gt; #include&amp;lt;DbgHelp.h&amp;gt; #pragma co...
ubuntu 生成core文件
在ubuntu下,设置core dump文件的生成方法:  1.#ulimit -a//core file size 选项的值,如果为0,则说明系统并不能在段错误是生成core dump;  2.没有就只能自己动手了。不限制生成core dump文件的大小:  #ulimit -c ulimited //open core dump  如果需要限制core文件大小:  #ulim
core文件生成及使用gdb调试
1.生成core文件的设置 首先,linux下默认不生成core文件。 使用使用ulimit -c命令可查看core文件的生成开关,如果为0则表示关闭此功能。 使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。 使用ulimit -c unlimited,则表示core文件的大小不受限制。 有以下三种方法可以生成core文件:...
core文件生成问题
1、问题:当前文件夹无法生成core文件   修改core 文件生成路径为当前路径。方法如:echo core.%e.%p > /proc/sys/kernel/core_pattern 2、问题:修改core文件大小为unlimited后,显示core文件 is not a core dump:不可识别文件 首先确保修改了 ulimit -c unlimited修改后还是无
为何无法产生core文件?
有一程序:rnrn/* Name: mycore.c */ rn#include rnint main(void)rnrn char *x = 0x0;rn *x = 1;rn printf("%s", x);rn strcpy(x, "This is wrong");rn return 0;rnrnrnrn用gcc -g mycore.c编译后,运行./a.out提示segmentation fault.但是没有看到core文件生成,因此用gdb ./a.out core调试时,提示没有core文件.rn
Linux下core文件的生成和使用
什么是core文件 当程序异常终止时,内核有可能把该程序当前的内存信息映射到core文件里,以方便程序员定位问题。也就是说core文件是进程异常终止时的一个内存镜像,可以用gdb来打开core文件,协助分析程序问题。 core文件说明时候产生
ios中backtrace获取不到某些代码崩溃的函数堆栈
rt,我在做一个ios崩溃收集的demo,具体是建了一个crash按钮,然后在按钮的响应函数(begincrash)里写了崩溃的代码,现在是这样的rn[code=objc]- (IBAction)beginCrash:(id)sender rn rn int *pi = (int*)0x00001111;rn *pi = 17;rnrn[/code]rnrn然后捕获到信号后获取堆栈,获取堆栈的代码是这样的rn[code=objc]+(NSArray *)getBacktracernrn void* callstack[128];rn int frames = backtrace(callstack, 128);rn char **strs = backtrace_symbols(callstack, frames);rn rn int i;rn NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];rn for (i=0;i
Linux 生成 core文件
ulimit -c unlimited 编译的时候要加 -g
关于core文件的生成
 1、core文件简介 Core,又称之为Core Dump文件,是Unix/Linux操作系统的一种机制。OS在出Core的同时,虽然会终止掉当前进程,但是也会保留下第一手的现场数据,OS仿佛是一架被按下快门的相机,而照片就是产出的Core文件。里面含有当进程被终止时内存、CPU寄存器等信息,可以供后续开发人员进行调试。 由此,可以利用这个特性,打开core文件生成开关
gdb生成core文件
1,首先,通过 ps-ef 命令查找pid进程号 由图可知,我所要查找的mvp进程,它的进程号为8114 第二步:输入gdb命令 第三步:输入, ‘attach 8114’命令将gdb附加到进程8114上 第四步:使用gcore core_name 生成coredump文件 core_name 第五步:使用detached断开连接 第六步:输入q命令
core文件生成及使用
core dump 生成的原因 内存访问越界(地址,权限) 多线程程序使用了线程不安全的函数 多线程race condition 非法指针 堆栈溢出 未完待续 注意: 部分信号会导致进程直接崩溃,但不产生core文件 生成core dump 文件 #允许生成core文件 ulimit -c 1024 #打开配置文件,设置core文件...
linux生成core文件
linux下生成core文件,便于你系统进行调试,很不多的方法啊!
怎样才能生成.core文件
我的一个相当大的程序,总是时不是的出现Segmentation fault,想生成.core文件调调。rn我执行了ulimit 88888888命令,怎么还是不出现.core文件?
linux进程生成core文件
1.在linux终端设置core文件的全局开关 ulimit -c 1024,全局开启大小,默认为0 2.设置第一步后,如果某些进程挂掉的时候还是未生成core文件, 则需要将进程的core文件开关也开启,开启开关为:cat /proc/pid/limits里的Max core file 3.也可以在内核暴力将所有进程的core文件开关都开启 修改位置为: ...
PHP调用了mysql存储过程后无法继续查询数据库的问题解决办法
public function test(){ $lon = $_POST['LON']; $lat = $_POST['LAT']; if ($_POST['time_val']) { $insertTime = date('Y-m-d H:i:00',strtotime($_POST['time_val'].'-3 minutes'...
C#调用了API后是不是就无法维持跨平台了?
也就成了一个普通的Windows RAD工具了?
right()函数在VB6中无法使用了
最近因为机子出问题,重新安装了系统和VB6.0,结果原来好的程序在调试时提示:编译错误,找不到工程或库!然后,VB提示将Right这个函数选中!请问高手,这是什么原因造成的,如何解决!谢谢!
利用backtrace函数打印函数调用栈
我们一般打印函数调用栈可以选择GDB的backtrace命令,简写bt命令都可以。这里有一个新的方法,那就是利用backtrace函数打印,不过还要加上backtrace_symbols()函数。 int backtrace(void **buffer, int size) 该函数用于获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数 size 用来指
对话框中调用了菜单
小弟做的对话框中添加了菜单资源,现在想在刚运行时,屏蔽掉几个子项,也就是想让他们变成灰色的!自己先做了下,就是用rnGetMenu()->GetSubMenu(1)->EnableMenuItem(1,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);rn在MSDN中看到说要这样设置rnm_bAutoMenuEnable=false;rn可是,我就那样放在上面,确报错说m_bAutoMenuEnable没有定义,rn可是我点这个参数,确能找到他在afxwin.h中定义了的,我从新定义的话,也不行,请问大家该怎么做了!
Linux中ulimit -c生成core文件()
理解这六个shell脚本语言的功能 echo “kernel.core_pattern = /tmp/core-%e-%p-%t” &amp;gt;&amp;gt; /etc/sysctl.conf sysctl -p /etc/sysctl.conf echo “ulimit -c unlimited”&amp;gt;&amp;gt;/etc/profile ulimit -c unlimited kill -9 ps -ef...
重装系统后数据库无法用了
Microsoft JET Database Engine (0x80040E09) rn不能更新。数据库或对象为只读。 rn rn只要是更新超作都是这个提示! rn但是重装系统前没有任何问题! rn rn前后系统都是 winxp pro rn数据库access
linux 后台进程无法产生core文件
首先说一下我程序启动 rn sigset(SIGUSR1, vExitPoll);rn sigset(SIGTERM, vExitPoll);rn sigset(SIGSEGV, vExitPoll);rn sigset(SIGINT, vExitPoll);rn然后进入服务监听,然后多线程处理,在交互过程中 偶尔出现 段错误, 也就是信号11,rn(SIGSEGV),但是无法产生core文件,导致很难定位问题。rnrn请教大神,为什么无法产生core文件呢? 我其他设置ulimit -c 都是OK (unlimit), rn进入单进程调试发现可以产生,现在我怀疑是不是我程序中用到某些函数导致,rn首先想到是sigset,我将该函数全部屏蔽,但是结果也是一样。rnrnhelp,help, 在线等
补间动画调用了VIEW哪些函数?
ANDROID的动画使用起来很方便,偶尔也会想想,这些动画动了VIEW的哪些回调函数呢?今天闲来无事,试了下。 上代码:package thepoor.com.testanimation;import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import
xen虚拟机启动过程调用了哪些函数
在ubuntu11.10上装了xen,在xen上装了win7虚拟机,请问在启动win7虚拟机这个过程中,使用了xen源代码中哪些函数。我已经找到了此目录下(xen-4.1.3\tools\python\xen\xend)的XendDomain.py和XendDomainInfo.py两个文件,这两个文件里边有start()函数,但似乎不全。比如我想知道哪些函数读取了虚拟机win7.img及其配置文件。求熟悉xen的前辈解答,谢谢!
【调用了这个两个函数,串行化出错】
串行化的框架rnrn[code=C/C++]void CManufacturerTestDoc::Serialize(CArchive& ar)rnrn if (ar.IsStoring())rn rn //即使这里什么也不做也不会出错 目前这里调用的是rn SaveRecvPacketDataBuffer(ar);rn rn elsern rn LoadRecvPacketData(ar);rn rn[/code]rnrn但是调用了我的两个函数rnrn在运行完这个函数void CManufacturerTestDoc::Serialize(CArchive& ar)rnrn就出错了rnrn[img=http://hi.csdn.net/attachment/201104/7/341458_1302153871rI8Z.gif][/img]rnrn下面我贴一下我的两个函数rnrn[code=C/C++]//保存函数rnBOOL CManufacturerTestDoc::SaveRecvPacketDataBuffer(CArchive& ar)rnrn UCHAR buffer[1024];rn CString m_FilePath = "";rn CString m_Ftype = "";rn int m_len = 0;rn int nDataLength;rnrn int nPacketCount;rn NetPacket_t pNetPacket;rn int nMid;rn rn //获得存储路径rn CFile* pFile = ar.GetFile();rn m_FilePath = pFile->GetFilePath();rn pFile->Close();rnrn LPCTSTR FilePath = m_FilePath.GetBuffer(0);rn rn //合并文件类型和换行回车rn m_Ftype = strFileType + "\r\n";rn //传入bufferrn memcpy(buffer, m_Ftype.GetBuffer(0), m_Ftype.GetLength());rn m_len = m_Ftype.GetLength();rn SaveRecvPacket(buffer, m_len, FilePath);rn m_Ftype.ReleaseBuffer();rnrn //先保存数据包个数rn rn nPacketCount = (int)m_vtNetPacketVector.size();rn memcpy(buffer, &nPacketCount, sizeof(int));rn m_len = sizeof(int);rn SaveRecvPacket(buffer, m_len, FilePath);rnrn //依次保存每个数据包的数据rn for (int i = 0 ; i < nPacketCount ; i ++)rn rn m_len =0;rn memset(buffer, 0, 1024);rn pNetPacket = m_vtNetPacketVector.at(i);rnrn nMid = (int)pNetPacket.net;rn memcpy(buffer, &nMid, sizeof(int));rn m_len = sizeof(int);rnrn nMid = (int)pNetPacket.status; rn memcpy(buffer+m_len, &nMid, sizeof(int));rn m_len += sizeof(int);rn rn memcpy(buffer+m_len, &pNetPacket.tm.wDay, sizeof(WORD));rn m_len += sizeof(WORD);rn rn memcpy(buffer+m_len, &pNetPacket.tm.wDayOfWeek, sizeof(WORD));rn m_len += sizeof(WORD);rn rn memcpy(buffer+m_len, &pNetPacket.tm.wHour, sizeof(WORD));rn m_len += sizeof(WORD);rn rn memcpy(buffer+m_len, &pNetPacket.tm.wMilliseconds, sizeof(WORD));rn m_len += sizeof(WORD);rn rn memcpy(buffer+m_len, &pNetPacket.tm.wMinute, sizeof(WORD));rn m_len += sizeof(WORD);rn rn memcpy(buffer+m_len, &pNetPacket.tm.wMonth, sizeof(WORD));rn m_len += sizeof(WORD);rn rn memcpy(buffer+m_len, &pNetPacket.tm.wSecond, sizeof(WORD));rn m_len += sizeof(WORD);rn rn memcpy(buffer+m_len, &pNetPacket.tm.wYear, sizeof(WORD));rn m_len += sizeof(WORD);rn rn nMid = (int)pNetPacket.type; rn memcpy(buffer+m_len, &nMid, sizeof(int));rn m_len += sizeof(int);rn rn nDataLength = (int)pNetPacket.data.size() * sizeof(unsigned char);rn memcpy(buffer+m_len, &nDataLength, sizeof(int));rn m_len += sizeof(int);rn SaveRecvPacket(buffer, m_len, FilePath);rn rn BYTE byteData[4096];rn memcpy(byteData, pNetPacket.data._Myfirst, nDataLength);rn SaveRecvPacket(byteData, nDataLength, FilePath);rn rn return TRUE;rn[/code]rnrn上面函数中调用的SaveRecvPacket函数rnrn[code=C/C++]void SaveRecvPacket(UCHAR* buffer, DWORD dwLen , LPCTSTR FilePath)rn rn FILE *fp;rn if((fp=fopen( FilePath,"ab+"))==NULL)rn rn MessageBox(NULL, "文档指针失败!", "提示", MB_OK); rn rn fwrite(buffer, dwLen, 1, fp);rn fclose(fp);rn [/code]rnrn大家帮忙给看看 是不是什么没释放 还是什么溢出 还是什么没关闭啊
CMainFrame::LoadFrame都调用了哪些函数?
俺想知道LoadFrame在建立主窗口时都发过哪些消息,调用过哪些函数,还望大虾们赐教。rnrn好像通过WM_SIZE触发过OnSize函数,其他的还有么?
按关闭按钮调用了onclose以外的函数???
我生成了一个对话框项目,在按关闭按钮时除了调用onclose函数外还调用OnServer,而onclose中没有使用该函数。rn为什么会这样呢?是消息映射出了问题吗?rnrnBEGIN_MESSAGE_MAP(CPraWinsockDlg, CDialog)rn ON_WM_SYSCOMMAND()rn ON_WM_PAINT()rn ON_WM_QUERYDRAGICON()rn //AFX_MSG_MAPrn ON_BN_CLICKED(IDServer, &CPraWinsockDlg::OnServer)rn ON_BN_CLICKED(IDClient, &CPraWinsockDlg::OnClient)rn ON_BN_CLICKED(IDOK, &CPraWinsockDlg::OnOK)rn ON_EN_UPDATE(IDC_Input,OnInput)rn ON_MESSAGE(SERVER_MESSAGE,OnServerMessage)rn ON_MESSAGE(CLIENT_MESSAGE,OnClientMessage)rn ON_WM_CLOSE()rnEND_MESSAGE_MAP()
linux下设置coredump文件的开关和路径
core文件开关 core文件路径
linux 生成core文件相关配置
linux程序段错误后,并不一定会生成core文件,这个需要相应的配置才能生效1.文件大小配置:ulimit -a 查看,core file 属性配置需要 unlimited2.生成设置:在/etc/profile下新建个脚本,core_start.sh ,填写 ulimit -c unlimited,这样开关机都能有效生成位置配置:/proc/sys/kernal/core_pattern ,如...
如何判断那个Click事件调用了函数
在vc中做了一个Dialog,加了两个按钮,让他们调用View类中的OnDraw函数,rn请问:在onDraw中如何判断它是被那个按钮调用的 ,谢谢
为什么调用了QMessageBox::information()后程序崩溃了?
QMessageBox::information(NULL, tr("Error!"),rn tr("A偏移量超出范围!"),rn QMessageBox::Ok | QMessageBox::Cancel,rn QMessageBox::Cancel);rn这句执行完,点击OK或者Cancle后程序就崩溃了,只能关闭。rn试了:rnQMessageBox::information(NULL, tr("Error!"),rn tr("A偏移量超出范围!"),rn QMessageBox::Ok);rn仔细调试后发现时在后面一句painter.drawPath(path);时发生了问题,如果将QMessageBox::information这句去掉则不会发生这个问题。我知道这个一般是指针的问题,但是不懂如何去找到问题?rn
调用了DLL后,退出程序时出错
程序只要DELPHI编的DLL中的一个函数后,在退出程序后出错“WINDOWS产生了一个错误。。。。。。。”,不知是什么原因。rn
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview