Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 程序接收到信号SIGSEGV,分段故障(程序耗尽堆栈。)_C_Gdb_Segmentation Fault - Fatal编程技术网

C 程序接收到信号SIGSEGV,分段故障(程序耗尽堆栈。)

C 程序接收到信号SIGSEGV,分段故障(程序耗尽堆栈。),c,gdb,segmentation-fault,C,Gdb,Segmentation Fault,当我用gdb运行程序时,我收到了这个错误消息。错误显示在这一行: long a = thread_fake(); //in file1.c 我在一个单独的文件中定义了另一个函数,因此我将它简化为一个只返回0的简单函数。 该功能已定义为: long thread_fake(){ //defined in file2.c return 0; } 正如@EmployedRussian所指出的,这个程序似乎已经用完了堆栈。valgrind显示以下错误: ==14711== 144 bytes

当我用gdb运行程序时,我收到了这个错误消息。错误显示在这一行:

long a = thread_fake(); //in file1.c
我在一个单独的文件中定义了另一个函数,因此我将它简化为一个只返回0的简单函数。 该功能已定义为:

long thread_fake(){ //defined in file2.c
    return 0;
}
正如@EmployedRussian所指出的,这个程序似乎已经用完了堆栈。valgrind显示以下错误:

==14711== 144 bytes in 1 blocks are possibly lost in loss record 17 of 32
==14711==    at 0x4025315: calloc (vg_replace_malloc.c:467)
==14711==    by 0x4010CD7: allocate_dtv (dl-tls.c:300)
==14711==    by 0x401146B: _dl_allocate_tls (dl-tls.c:464)
==14711==    by 0x40475C6: pthread_create@@GLIBC_2.1 (allocatestack.c:570)
==14711==    by 0x8050583: tm_main_startup 
==14711==    by 0x8048F6B: main (genome.c:201)
==14711== 144 bytes in 1 blocks are possibly lost in loss record 18 of 32
==14711==    at 0x4025315: calloc (vg_replace_malloc.c:467)
==14711==    by 0x4010CD7: allocate_dtv (dl-tls.c:300)
==14711==    by 0x401146B: _dl_allocate_tls (dl-tls.c:464)
==14711==    by 0x40475C6: pthread_create@@GLIBC_2.1 (allocatestack.c:570)
==14711==    by 0x804DFE3: thread_startup (thread.c:151)
==14711==    by 0x8048F73: main (genome.c:203)
创建的所有线程都通过相应的pthread_join调用连接起来。我还尝试了sgcheck工具,但它在“x86-linux”平台上不起作用。请帮忙

bt命令的完整输出:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x406e8b70 (LWP 19416)]
sequencer_run (argPtr=0x89fce00) at sequencer.c:251
251 a = thread_fake();
(gdb) bt
#0  sequencer_run (argPtr=0x89fce00) at sequencer.c:251
#1  0x0804e306 in threadWait (argPtr=0x89dc1f4) at ../lib/thread.c:105
#2  0x4003be99 in start_thread (arg=0x406e8b70) at pthread_create.c:304
#3  0x40253cbe in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:130
错误显示在这一行:

long a=thread_fake()//在file1.c中

如果您的程序堆栈已用完,则可能会出现SIGSEGV
SIGSEGV
情况

使用
x/i$pc
检查GDB中的实际崩溃指令

如果指令是
推送
,或
调用
,则我的猜测得到确认

另一种可能性是:您已经通过优化编译了代码,而实际的错误指令与它所属的源代码行几乎没有关系

更新:

是,它给出一个调用
调用0x804e580
。解决办法是什么

解决方法是不要耗尽堆栈。执行GDB
where
命令,然后在导致崩溃的每个帧中,执行
info frame
并查找过大的帧

不要在堆栈上分配太多数据,或者增加堆栈大小(
ulimit-s

valgrind显示以下错误:

就是

  • 不是错误
  • 与你的问题无关
更新2:

如何检查每个框架的大小

鉴于此:

Stack level 0, frame at 0xffffc248:
...
Stack level 1, frame at 0xffffc250:
...
Stack level 2, frame at 0xffffc2a0:
帧1的大小为
8
0xffffc250-0xffffc248
),帧2的大小为
80
,等等

最终更新:


事实证明,我上面的过程无法测量帧#0的大小,结果是。。。61MB!由于存在大量本地数组(正如Grady Player正确猜测的那样)。

您是否在file1.c或其包含的头文件中声明了该函数?@n.m.在file1包含的头文件file2.h中声明。c@JamesMcLaughlin不,您写下在使用gdb运行程序时出现此错误。当你在gdb之外运行它时会发生这种情况吗?请给出一个最短的、完整的、可编译的例子来重现错误。这是一个很好的可能性。。。op应该寻找类似int巨型[23456678899]的东西;再也不要这样做了。@EmployedRussian是的,它会调用“call 0x804e580”解决方案是什么?@EmployedRussian还有一件事我想提的是,该程序在单线程上运行良好,但在2个或更多线程上以SIGSEGV结束。@EmployedRussian我还检查了where和info frame命令。但是我如何检查每个帧的大小呢。它只是提到了类似的-Stack level 0,sequencer_run(sequencer.c:251)中0x406e8370处的帧:eip=0x8049a3c;保存的eip 0x804e476由0x406e8390源语言c处的帧调用。0x406e8368处的Arglist,0x406e8368处的args:argPtr=0x89fde00局部变量,上一帧的sp为0x406e8370保存的寄存器:0x406e835c处的ebx,0x406e8368处的ebp,0x406e8360处的esi,0x406e8364处的edi,0x406e8364处的eip0x406e836c@ceedee因此,您几乎立即用完了堆栈,而几乎没有消耗任何堆栈空间。你到底是如何创建这个线程的?