Если Вы не знаете, какой тип исключительной ситуации поймать или что сделать с ним, нет никакого смысла в наличии оператора выгоды. Необходимо просто оставить его для вызывающей стороны большой шишки, которая может иметь больше информации о ситуации для знания, что сделать.
Вы должны все еще иметь наконец оператор там в случае, если существует исключение, так, чтобы можно было очистить ресурсы, прежде чем то исключение будет выдано вызывающей стороне.
Получите madExcept , и он точно скажет вам, что происходит во время ошибки. Вы увидите полный стек, и особенно то, где он убегает.
Вы должны УМЕНЬШИТЬ размер стека в параметрах компоновщика. Затем запустите его под отладчиком, и, надеюсь, проблема обнаружится, и вам не придется ждать два часа.
Я бы почти сказал: запустите его в отладчике; ^)
Раньше я добавлял функцию входа и выхода из журнала в каждый метод. С правильным отступом я мог отслеживать в журнале путь вызова.
Когда произойдет переполнение стека, он действительно будет виден в журнале, поскольку уровень отступа должен быть выше крыши
void someMethod()
{
logMethodEnter("someMethod");
... do stuff...
log("something")
... do stuff...
logMethodLeave("someMethod");
}
, регистратор будет отслеживать текущую глубину журнала и журнал такой:
>someMethod
something
<someMethod
У вас установлена IDE на тестовой машине? Если да, попробуйте воспроизвести проблему в среде IDE. Когда происходит переполнение стека, посмотрите на стек вызовов (View-> Debug Windows-> Call Stack). Вероятно, одна и та же функция будет вызываться много раз, например:
FunctionA
FunctionB
FunctionA
FunctionB
FunctionA
FunctionB
...
Если вы это видите, значит, вы знаете, что эти функции вызывают друг друга, но не завершают работу.
Если у вас не установлена IDE на тестовой машине, то вы все еще можете сделать это через удаленную отладку. Если вы предоставите немного больше информации о своем сценарии, мы сможем помочь больше.
В частности, может быть полезно узнать:
Вы можете увеличить размер стека, используя параметры компоновщика проекта или директиву компилятора $ M, но я не думаю, что это решит проблему, если только стек действительно мал.
Если вы запускаете приложение в отладчике, в конечном итоге оно сломается при возникновении исключения.
Если вы используете поток (не основной, например, соединение с сокетом) и основной поток, они используют один и тот же стек. Решите так: просто создайте поток с собственным стеком для каждого соединения.
Проблема> каждый вызов, который вы выполняете, вызывает стек для фрейма (общая такая большая проблема) например, вы вызываете 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
.