Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

debugging - Ultimate guide to Debug in Delphi

Is there a complete resource for debugging in Delphi that instructs on how to use all the IDE debugging tools? There used to be a guide from Marco Cantù but it was updated to Delphi 5 if I am not wrong.

May you please redirect me to a complete resource updated at least to D2009 (better if XE).

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

The debugging resource PDF didn't mention my favorite debugging technique:

Let's say you wanted to break if a certain, complex, only-available at runtime condition was met.

You could say

if <MyExpressionA> then
asm
  int 3; // Enter CPU Debugger
end;

Or you could say

if not <MyExpressionB> then
asm
  int 3; // Enter CPU Debugger
end;

Where ExpressionA is something you NEVER expect to be true (i.e., if it's true, it signals an anomalous condition), OR where ExpressionB is something you ALWAYS expect to be true (i.e., if it's false, it signals an anomalous condition).

Remember that either expression can contain multiple function calls -- if you need them.

You could put them inside of a block, inside of {$IFDEF DEBUG}, like this:

procedure MyProcedure;
var X: Integer;
begin
  X := GetTheAnswerToLifeTheUniverseAndEverything();

  {$IFDEF DEBUG}
  if X <> 42 then // Highly contrived example
  asm
    int 3; // Enter CPU Debugger -- Press F8 when here to step back into source...
  end;
  {$ENDIF}

  // More code here...

end;

You can also use

ASSERT(Expression, "Message"); ASSERT(not Expression, "Message");

To make sure things function as expected in your code.

If ASSERTs are enabled in the IDE and an ASSERT fails -- the ASSERT will create an exception, which will unwind the stack to the last exception handler for its type...

Using my int3 method -- you get immediately into the CPU debugger -- where, if you hit F8 (step over), you'll step to the next line of code -- you can inspect variables, see the whole call stack, and even continue stepping in your code...


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...