Остановка программы delphi в бесконечном цикле

Когда в Delphi происходит неопределенный цикл, отладчик даже не выдаст мне трассировку стека, когда я нажму кнопку остановки. Если у меня есть подозрение, где программа останавливается, я могу поставить точку останова, и она остановится, если это правильный неопределенный цикл.

Вот пример программы, которая намеренно вызывает неопределенный цикл:

procedure TForm1.btnDebugInfiniteLoopClick(Sender: TObject);
var I: Integer;
begin
    I:=0;
    while I64 then I:=I div 2;
    end;
end;

Когда остановился, я получаю что-то похожее на:

ntdll.RtlUserThreadStart:
776301B4 89442404         mov [esp+$04],eax
776301B8 895C2408         mov [esp+$08],ebx
776301BC E9E99C0200       jmp $77659eaa
776301C1 8DA42400000000   lea esp,[esp+$0000]
776301C8 8DA42400000000   lea esp,[esp+$0000]
776301CF 90               nop 
ntdll.KiFastSystemCall:
776301D0 8BD4             mov edx,esp

...

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

 Robert Richter24 окт. 2012 г., 22:40
Delphi XE3 - это версия начала использования.
 GolezTrol24 окт. 2012 г., 22:48
Если вы установите точку останова в подозрительном цикле, вы увидите, останавливается ли там выполнение программы.
 Rob Kennedy24 окт. 2012 г., 22:57
Когда вы начинаете одноступенчатый, вы уверены, чтоперешагнуть в нужную ветку? Delphi не делаетЯ не знаю, какую нить вы хотите, поэтому она выбирает одну. Убедитесь, что вы выбрали основной поток, изатем проверьте стек вызовов.
 Robert Richter24 окт. 2012 г., 23:04
Спасибо, Роб! Это очень помогло. Я не'не понимаю, что я мог бы получить стек вызовов таким образом.
 Rob Kennedy25 окт. 2012 г., 02:36
Кстати, какой у тебя вопрос?
 Rigel06 февр. 2017 г., 12:41
похожая проблема здесь:stackoverflow.com/questions/42066834/...
 Ken White24 окт. 2012 г., 22:37
Ты нене указать, какую версию Delphi вы 'Вы используете в этом или вашем предыдущем вопросе. Поскольку это может зависеть от версии, вы можете добавить тег, который указывает на эту версию, а также на общую.delphi
 Robert Richter25 окт. 2012 г., 02:46
Мой вопрос заключается в том, как заставить отладчик показать мне, где остановилась программа. По какой-то причине, хотя я использую только один поток, в отладчике есть четыре потока. Роб Кеннеди ответил на мой вопрос, указав, что я должен выбрать правильный поток, и тогда я смогу увидеть, где остановилась программа. Происходило то, что я пытался сделать один шаг в сборке, надеясь добраться до своего источника, но я был не в той теме (и я ее никогда не создавал).

Ответы на вопрос(2)

Как альтернативный ответ: учитывая васИспользуя Delphi XE3, он поставляется вместе с профилировщиком: AQTime, который быстро и быстро находит такие вещи.

Решение Вопроса

Ответил в комментариях Роб Кеннеди. Я должен открыть представление потока из окна отладки, чтобы получить список потоков и выбрать правильный поток; в этот момент я вижу, где моя программа бесконечно зацикливается.

Ваш ответ на вопрос