Valgrind报告可能的堆栈溢出 - 这是什么意思?

时间:2011-10-31 07:02:27

标签: c memory out-of-memory bit

当我使用valgrind运行我的C程序文件时,我收到以下错误和分段错误。这是什么意思?

由于一个函数的递归调用更深

,我得到了这个错误

我为字符指针分配了9684173个字节 我malloc成功,我在一个函数的Recursivly调用中得到了分段错误。所以解决这个问题吗?

==3100== Stack overflow in thread 1: can't grow stack to 0x7fe801ff8
==3100== 
==3100== Process terminating with default action of signal 11 (SIGSEGV)
==3100==  Access not within mapped region at address 0x7FE801FF8
==3100==    at 0x4014D8: huffman_decoding (filebits.c:471)
==3100==  If you believe this happened as a result of a stack
==3100==  overflow in your program's main thread (unlikely but
==3100==  possible), you can try to increase the size of the
==3100==  main thread stack using the --main-stacksize= flag.
==3100==  The main thread stack size used in this run was 8388608.
==3100== Stack overflow in thread 1: can't grow stack to 0x7fe801ff0
==3100== 
==3100== Process terminating with default action of signal 11 (SIGSEGV)
==3100==  Access not within mapped region at address 0x7FE801FF0
==3100==    at 0x4A2269F: _vgnU_freeres (vg_preloaded.c:58)
==3100==  If you believe this happened as a result of a stack
==3100==  overflow in your program's main thread (unlikely but
==3100==  possible), you can try to increase the size of the
==3100==  main thread stack using the --main-stacksize= flag.
==3100==  The main thread stack size used in this run was 8388608.
==3100== 
==3100== HEAP SUMMARY:
==3100==     in use at exit: 22,490,801 bytes in 179 blocks
==3100==   total heap usage: 179 allocs, 0 frees, 22,490,801 bytes allocated
==3100== 
==3100== LEAK SUMMARY:
==3100==    definitely lost: 0 bytes in 0 blocks
==3100==    indirectly lost: 0 bytes in 0 blocks
==3100==      possibly lost: 0 bytes in 0 blocks
==3100==    still reachable: 22,490,801 bytes in 179 blocks
==3100==         suppressed: 0 bytes in 0 blocks
==3100== Reachable blocks (those to which a pointer was found) are not shown.
==3100== To see them, rerun with: --leak-check=full --show-reachable=yes
==3100== 
==3100== For counts of detected and suppressed errors, rerun with: -v
==3100== Use --track-origins=yes to see where uninitialised values come from
==3100== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 4 from 4)
Segmentation fault

2 个答案:

答案 0 :(得分:2)

你要么试图在堆栈上分配太多,要么调用递归函数太深。

由于你提到“我想压缩一个大小为12 MB的大文件”,我有一种强烈的感觉,你试图在堆栈上分配12M。

答案 1 :(得分:0)

此消息表示您正在尝试在堆栈中分配大量数据,以解决此问题尝试将堆栈释放为possobile或者您必须使用ulimit命令增加堆栈大小

  

ulimit -s new_size

或使用C中的“setrlimit”功能

当然我不建议这样做,如果你使用大堆栈大小,请改用malloc。