Stopping delphi program in an infinite loop
Asked Answered
S

2

5

When an indefinite loop occurs in Delphi, the debugger will not even give me a stack trace when I hit the stop button. If I have a suspicion of where the program is stalling, I can put a breakpoint and it will stop if that is the correct indefinite loop.

Here is a sample program to deliberately cause an indefinite loop:

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;

When stopped, I get something that looks like:

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

...

As I single step (F7), it single steps a few lines, then locks up until I hit break again, at which point I get the same result.

Septempartite answered 24/10, 2012 at 20:25 Comment(8)
You don't indicate which version of Delphi you're using in this or your previous question. Since this may be version specific, you may want to add a tag that indicates that version as well as general delphi.Madra
Delphi XE3 is the version begin used.Septempartite
If you set a breakpoint in the suspect loop, you will see if program execution halts there.Semifinal
When you start single-stepping, are you sure you're stepping in the right thread? Delphi doesn't know which thread you want, so it just picks one. Make sure you select the main thread, and then check the call stack.Micelle
Thanks, Rob! That helped a lot. I didn't realize I could get a call stack this way.Septempartite
By the way, what is your question?Micelle
My question is how to get the debugger to show me where the program stalled at. For some reason, even though I am only using one thread, there are four threads in the debugger. Rob Kennedy answered my question by pointing out that I must choose the correct thread and then I can see where the program stalled. What was happening is I was trying to single step in assembly hoping to get to my source but I was in the wrong thread (and one I never created).Septempartite
similar problem here: #42067334Fredericafrederich
S
7

Answered in comments by Rob Kennedy. I must open a thread view from debug window to get a list of threads and choose the correct thread; at that point I can see where my program is indefinitely looping.

Septempartite answered 25/10, 2012 at 0:50 Comment(0)
B
1

As alternative answer: considering you're using Delphi XE3, it comes bundled with the profiler: AQTime which will find things like this real real fast.

Bezel answered 25/10, 2012 at 7:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.