Valgrind сообщает о возможном переполнении стека - что это значит? - PullRequest
0 голосов
/ 31 октября 2011

Когда я запускаю свой программный файл на C, используя valgrind, я получаю следующую ошибку и ошибку сегментации.Что это значит?

Я получил эту ошибку из-за рекурсивного вызова одной более глубокой функции

я выделил 9684173 байта для символьного указателя, я malloc успешно и я получил ошибку сегментации при рекурсивном вызовефункционирует глубоко.так какое-нибудь решение этого ??

==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 ]

2 голосов
/ 31 октября 2011

Вы либо пытаетесь выделить слишком много в стеке, либо слишком глубоко вызываете рекурсивную функцию.

Поскольку вы упоминаете «я хочу сжать один большой файл размером 12 МБ», у меня возникло сильное ощущение, что вы пытаетесь выделить 12M в стеке.

0 голосов
/ 31 октября 2011

Это сообщение означает, что вы пытаетесь выделить много данных в вашем стеке, чтобы решить эту проблему, попробуйте освободить стек как возможный или вам нужно увеличить размер стека с помощью команд ulimit

ulimit -s new_size

или используя функцию "setrlimit" в C.

Конечно, я не рекомендую, если вы будете использовать большой размер стека, используйте вместо этого malloc.

...