Бег по ошибке 'переполнения стека'

Если Вы не знаете, какой тип исключительной ситуации поймать или что сделать с ним, нет никакого смысла в наличии оператора выгоды. Необходимо просто оставить его для вызывающей стороны большой шишки, которая может иметь больше информации о ситуации для знания, что сделать.

Вы должны все еще иметь наконец оператор там в случае, если существует исключение, так, чтобы можно было очистить ресурсы, прежде чем то исключение будет выдано вызывающей стороне.

5
задан Ether 22 February 2010 в 05:18
поделиться

6 ответов

Получите madExcept , и он точно скажет вам, что происходит во время ошибки. Вы увидите полный стек, и особенно то, где он убегает.

13
ответ дан 18 December 2019 в 05:26
поделиться

Вы должны УМЕНЬШИТЬ размер стека в параметрах компоновщика. Затем запустите его под отладчиком, и, надеюсь, проблема обнаружится, и вам не придется ждать два часа.

15
ответ дан 18 December 2019 в 05:26
поделиться

Я бы почти сказал: запустите его в отладчике; ^)

Раньше я добавлял функцию входа и выхода из журнала в каждый метод. С правильным отступом я мог отслеживать в журнале путь вызова.

Когда произойдет переполнение стека, он действительно будет виден в журнале, поскольку уровень отступа должен быть выше крыши

 void someMethod()
 {
      logMethodEnter("someMethod");

      ... do stuff...
      log("something")
      ... do stuff...

      logMethodLeave("someMethod");

 }

, регистратор будет отслеживать текущую глубину журнала и журнал такой:

 >someMethod
   something
 <someMethod
6
ответ дан 18 December 2019 в 05:26
поделиться

У вас установлена ​​IDE на тестовой машине? Если да, попробуйте воспроизвести проблему в среде IDE. Когда происходит переполнение стека, посмотрите на стек вызовов (View-> Debug Windows-> Call Stack). Вероятно, одна и та же функция будет вызываться много раз, например:

FunctionA
FunctionB
FunctionA
FunctionB
FunctionA
FunctionB
...

Если вы это видите, значит, вы знаете, что эти функции вызывают друг друга, но не завершают работу.

Если у вас не установлена ​​IDE на тестовой машине, то вы все еще можете сделать это через удаленную отладку. Если вы предоставите немного больше информации о своем сценарии, мы сможем помочь больше.

В частности, может быть полезно узнать:

  • Можете ли вы воспроизвести его?
  • Установлена ​​ли IDE на тесте машина?
  • Какая версия Delphi?
2
ответ дан 18 December 2019 в 05:26
поделиться

Вы можете увеличить размер стека, используя параметры компоновщика проекта или директиву компилятора $ M, но я не думаю, что это решит проблему, если только стек действительно мал.

Если вы запускаете приложение в отладчике, в конечном итоге оно сломается при возникновении исключения.

0
ответ дан 18 December 2019 в 05:26
поделиться

Если вы используете поток (не основной, например, соединение с сокетом) и основной поток, они используют один и тот же стек. Решите так: просто создайте поток с собственным стеком для каждого соединения.

Проблема> каждый вызов, который вы выполняете, вызывает стек для фрейма (общая такая большая проблема) например, вы вызываете proc aa (a, b: integer), например, при вызове всегда одной и той же функции или другой ;

У вас запущен поток сокета, и onconnect вы вызываете proc a; и продолжает делать что-то 5 секунд.

, если кто-то подключается перед закрытым подключением при подключении (стек выпуска). У вас есть 2 подключенных клиента (2 кадра стека различий с разными данными)

stack

push a, b (integer); Значения 5,10 - от 1 conn

нажимаем a, b (целое); Значения 7,3 - из 2 conn

, если onconnect вызывает функции a (5,10) и продолжает делать что-то в течение примерно 5 секунд. и кто-то снова подключается к сокету сервера, он вызывает соединение опять таки.

Стек является первым кадром вызова, но еще не вышел из строя. Итак, не вытолкнул a, b из (5,10)

Это сложнее, чем это, если вы снова вызовете proc, тогда он переопределит данные во 2 кадре (локальная переменная процесса 2 соединения), поэтому, когда 2 соединения получат данные из стека наверняка уже заменены другой информацией. поэтому он будет вести себя некорректно.

Когда первое соединение разорвано, появятся сообщения a, b, но 7,3 (из второго соединения), а не сохраненные 5,10. так что переполнение стека произойдет не в данный момент, а позже, когда программа будет запущена, и вы получите стек $ FFFFFFFF $ SP . поэтому он будет пытаться $ FFFFFFAA , когда вы вызываете функцию, поэтому она больше, чем ваш стек, например: $ M 65536 , а не 4 гигабайта, как $ FFFFFFAA .

0
ответ дан 18 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: