



Проблема не в трассировке стека, а в самом стеке. Каждый раз, когда вы вызываете метод, информация помещается в стек, что позволяет вам вернуться к вызывающему методу. Если вы выполняете достаточно рекурсии, в конечном итоге вы заполняете все пространство в стеке (которое ограничено максимальным размером), и ваша программа останавливается. Трассировка стека просто показывает вашу историю вызовов. Вероятно, у вас происходит бесконечная рекурсия, и вам нужно найти способ остановить ее до того, как ваша программа выйдет из строя. Либо в вашем алгоритме есть ошибка, либо вам нужно найти способ решить ее по-другому в пределах доступной вам памяти.
Если вы столкнулись с переполнением стека из-за выхода рекурсии из-под контроля, вам не повезло. Содержимое стека необходимо для возврата из вызовов функций, разумно «очистить» его невозможно. Проблема не в Map, возвращаемом getAllStackTraces (), а в фактическом содержимом стека.
Вам необходимо реструктурировать свой код, чтобы он не возвращался на такой глубокий уровень.
В качестве альтернативы вы можете исследовать, возможно ли увеличить размер стека, но требование нестандартного размера стека обычно является признаком проблемной реализации.
Сначала убедитесь, что в коде вашей программы нет ошибки, вызывающей бесконечную рекурсию, приводящую к переполнению стека.
Если это не так, вы можете попытаться выделить для своей программы больше места в стеке. В Linux это можно сделать с помощью команды ulimit bash, например:
ulimit -s 8000
или даже
ulimit -s unlimited
Если вам действительно нужно раскрутить стек, вы можете использовать setjmp / longjump в C или использовать исключения или продолжения, например:
struct ClearStack {} ;
void myLongComputationWhichCausesStackOverflow() {
// do something
if (needsToClearTheStack)
throw ClearStack() ;
// do something else
}
int main(int ac, char *av[]) {
try {
mylongcomputation() ;
// continuation of program
// no stack clearing occurred
}
catch(const ClearStack & cs) {
// the stack was cleared and do something appropriately
}
}
Он делает то, что вы хотите, но это не совсем хороший стиль программирования. Обратите внимание, что вам нужно придумать способ узнать, когда очищать стек. Это может быть довольно сложно, поскольку вы не можете знать, сколько места в стеке осталось, или вызов функции приведет к переполнению стека!
Это полезная информация, но не относится к этому вопросу.
Если стоит задача построить ЧРЕЗВЫЧАЙНО глубокое дерево в JSON - нечего называть «проблемной реализацией». Это задача, и рост размера стека влияет на ВСЕ потоки, что очень плохо для тяжелого многопоточного приложения. Я до сих пор не могу найти решение для этого.