Delphi中Debug的终极指南

时间:2010-10-22 07:43:18

标签: delphi debugging

是否有完整的Delphi调试资源,指导如何使用所有IDE调试工具?曾经有过MarcoCantù的指南,但如果我没有错,它会更新到Delphi 5.

请你重定向到一个完整的资源,至少更新到D2009(如果XE更好)。

5 个答案:

答案 0 :(得分:5)

IMO关于调试的官方文档是全面的:Debugging ApplicationsDebugging Applications。 AFAICS这两个网站的内容相似,但后者可能更新。

我还想在远程调试中注意Warren Postmatutorial,它帮助我立刻开始。

答案 1 :(得分:5)

调试资源PDF没有提到我最喜欢的调试技术:

假设您在运行时遇到某种复杂的,仅在运行时可用的情况下想要中断。

你可以说

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;

ExpressionA是你永远不会想到的东西 (即如果它是真的,它表示异常情况), 或者表达式是你总是希望成为现实的东西 (如果它是假的,则表示异常情况)。

请记住,任何一个表达式都可以包含多个函数调用 - 如果需要的话。

你可以将它们放在{$ IFDEF DEBUG}内的一个区块内,如下所示:

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;

您也可以使用

ASSERT(表达,“消息”); ASSERT(不是表达,“消息”);

确保代码中的内容按预期运行。

如果在IDE中启用了ASSERT并且ASSERT失败 - ASSERT将创建一个异常,它会将堆栈展开到其类型的最后一个异常处理程序...

使用我的int3方法 - 你可以立即进入CPU调试器 - 如果你点击F8(跳过),你将进入下一行代码 - 你可以检查变量,看看整个调用堆栈,甚至继续踩到你的代码......

答案 2 :(得分:3)

互联网是你的朋友,这里有两个关于调试的链接

Delphi - 调试技术

[PDF] http://www.scip.be/ScipViewFile.php?Page=ArticlesDelphi11

那里的内容仍然非常相关

答案 3 :(得分:3)

还要花一些时间在一个异常处理框架中,例如:

那里有所有好东西,如堆栈痕迹,行号等。

答案 4 :(得分:0)

我想补充 Peter Sherman 的出色回复:

我最喜欢的调试技术是

if <MyExpression> then
  asm nop end;

这段代码基本什么都不做,对运行性能没有影响。这是一个无操作。但是,您可以在该“asm”行上放置常规断点,它会像任何其他断点一样工作。 任何尝试过条件断点(尤其是那些内部循环)的人都知道,调试器评估断点条件可能需要很长时间,并且运行多个调试会话将成为一场噩梦。 在上述情况下,它全速运行,没有其他副作用。

附注:asm 块只能与 x86 编译器一起使用。