Это проблема, с которой я отказался. С большим количеством взломов и (в основном) молитв вы можете получить решение, которое работает в данный момент на данной машине. Но в целом, похоже, нет достойного способа сделать это.
Вам нужно будет получить положение и размер стека вне программы (на Linux вы можете получить ее от /proc/<pid>/maps
). В вашей программе вы должны как-то проверить, где вы находитесь в стеке. Использование локальных переменных возможно, но нет реальной гарантии, что они действительно находятся в стеке. Вы также можете попытаться получить значение из регистра указателя стека с некоторой сборкой.
Итак, теперь у вас есть местоположение стека, его размер и текущее положение, и вы предполагаете, что знаете, в каком направлении растет стек. Когда вы переходите в режим переполнения стека? Лучше не делать этого близко к концу, потому что ваша оценка (то есть адрес локальной переменной или значения из указателя стека), вероятно, немного оптимистична; это не редкость для адресации памяти за указателем стека. Кроме того, вы не имеете понятия о том, сколько места в стеке требуется для каждой данной функции (и функций, которые она вызывает). Таким образом, вам нужно будет оставить совсем немного места в конце.
Я могу только посоветовать вам не попасть в этот беспорядок и попытаться избежать очень глубокой рекурсии.Вы также можете увеличить размер стека; По-моему, в Windows вы должны скомпилировать это в исполняемый файл.
A (не большой) пример: void подпрограмма (int i) { char foo [20000]; i ++; , если (i <1000) подпрограмма (i); } – 2008-09-10 12:57:50