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

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

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

procedure TForm1.btnDebugInfiniteLoopClick(Sender: TObject);
var I: Integer;
begin
    I:=0;
    while I<100 do begin
        I:=1+1;
        if I>64 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), он делает несколько шагов на несколько строк, затем блокируется, пока я снова не нажму break, после чего я получаю тот же результат.


person Robert Richter    schedule 24.10.2012    source источник
comment
Вы не указываете, какую версию Delphi вы используете в этом или предыдущем вопросе. Поскольку это может зависеть от версии, вы можете добавить тег, указывающий эту версию, а также общий delphi.   -  person Ken White    schedule 25.10.2012
comment
Delphi XE3 — это начальная версия.   -  person Robert Richter    schedule 25.10.2012
comment
Если вы установите точку останова в подозрительном цикле, вы увидите, остановится ли там выполнение программы.   -  person GolezTrol    schedule 25.10.2012
comment
Когда вы начинаете пошаговое выполнение, вы уверены, что делаете правильный шаг? Delphi не знает, какой поток вам нужен, поэтому просто выбирает один. Убедитесь, что вы выбрали основной поток, а затем затем проверьте стек вызовов.   -  person Rob Kennedy    schedule 25.10.2012
comment
Спасибо, Роб! Это очень помогло. Я не понимал, что могу получить стек вызовов таким образом.   -  person Robert Richter    schedule 25.10.2012
comment
Кстати, какой у вас вопрос?   -  person Rob Kennedy    schedule 25.10.2012
comment
Мой вопрос заключается в том, как заставить отладчик показать мне, где программа остановилась. По какой-то причине, хотя я использую только один поток, в отладчике четыре потока. Роб Кеннеди ответил на мой вопрос, указав, что я должен выбрать правильный поток, и тогда я смогу увидеть, где программа остановилась. Происходило следующее: я пытался сделать один шаг в сборке, надеясь добраться до своего источника, но я был в неправильном потоке (и тот, который я никогда не создавал).   -  person Robert Richter    schedule 25.10.2012
comment
аналогичная проблема здесь: stackoverflow.com/questions/42066834/   -  person Z80    schedule 06.02.2017


Ответы (2)


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

person Robert Richter    schedule 25.10.2012

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

person Pieter B    schedule 25.10.2012