2010-12-09 136 views
3

我是一个很长一段时间的Delphi开发,并在过去我使用第三方工具,记录和调试,同时开发(称为智能检查),但是现在我已经升级到德尔福XE我想尝试并使用IDE进行调试。调试代码

我的问题是,由于像

procedure MyFunction; 
var 
    str : string; 
begin 
    str := 'Foo'; 
    //Debug, show value of str? 
    str := AnotherFunction(str); 
    //Debug, show value of str? 
end; 

我怎么能调试,并得到str的值,而不做愚蠢的事情像 showmessage(STR)的功能;

如果是在某个地方的视频(或物品),那么我很乐意阅读更多。

有没有办法收看/输出变量的值。

+0

5行,第7行:分配并没有用过,消除通过优化 – 2010-12-10 10:50:29

回答

7

那么,Delphi XE自带CodeSite日志记录,但我感觉你在谈论调试器本身。

如果你把一个断点在程序中,它会当它击中它打破调试器。从那里,您已经获得了IDE左侧的“局部变量”窗格和“手表”窗格。局部变量将显示所有当地人的价值,而Watches可让您设置其值将追踪的值。

通过使用Inspect(Alt-F5),您也可以获得与手表类似的东西,但具有更详细的信息(特别是结构化类型,例如对象)。此外,评估/修改(Ctrl-F7)将允许您键入表达式并对其进行评估。它不像Inspect那么细致,但它给了你更多的灵活性。

如果你熟悉这些工具,你会发现调试要容易得多。

5

1)可以使用的OutputDebugString函数输出字符串到调试窗口

2)可以使用的CodeSite快车。我推荐使用来自CodeRage 5的视频作为使用CodeSite的起点

+0

+1的OutputDebugString – RRUZ 2010-12-09 21:02:47

8

如果你只想使用IDE调试器,然后执行以下操作:

  • 将断点地方
  • 在breakpointr圈右击并选择“断点属性...”
  • 按“高级”按钮,显示更多选项
  • 取消“破发”复选框
  • 然后使用“日志信息”和“评估和演示表达”编辑框中输入跟踪值

这些消息将被发送到“事件日志”窗格中的调试器。右键单击窗格并选择“属性”。你可以过滤(“消息”)/ hilight(“颜色”)跟踪消息。

+1

12年德尔福的,我不知道这一点!有人知道它何时添加? – 2010-12-09 23:15:09

+1

@Gerry:至少Delphi 7。也许5或6;不要再安装它们来检查。 – 2010-12-10 00:12:40

0

我更喜欢调试器提示。打破调试器之后,将鼠标移动到代码中任何位置的“str”,您将看到其当前值。您也可以用鼠标突出显示某些语句并对其进行评估。例如,突出显示“AnotherFunction(str)”并将鼠标放在它上面。

1

其他回答都是正确的。

我个人最喜欢的技巧(与da-soft的回答相同)是创建一个断点,它将一条消息记录到事件日志中,其中包含一个我想记录的值,并且实际上不会“断开”是,执行继续,没有你点击运行图标)。然后每次到达这行代码时,我都会收到我的消息,并在日志中获得我的值。既然我可以回去阅读历史,以及查看当前值,我发现这比仅使用调试器监视窗口更有用。

但是,由于Delphi XE包含CodeSite,因此您可以远远超出断点处的表达式评估。但是,代码站点要求您修改代码以添加一些日志记录。但它比消息框好多了。

您也可以使用OutputDebugString(PChar(s))将任何字符串输出到调试器。由于这可以包含任何你想要的东西,这是一个非常好的调试方式,但不会向最终用户显示内容。在我的许多应用程序中,我有一个特殊的跟踪缓冲区,它是循环的(也就是说,它只保留最后500行左右)。当我看到一个问题时,我不仅会得到一个堆栈回溯,还会保存这个内存中的跟踪日志,所以我有一些关于在我的问题之前发生的事情的历史记录。

您还可以查看Log 4 Delphi项目。

0

任何其他答案都没有错,但我只是想添加这些有用的功能。

procedure DebugString (const s : string) ; overload ; 
begin 
    {$IFDEF DEBUG} 
    OutputDebugString (PChar (s)) ; 
    {$ENDIF} 
end ; 

procedure DebugString (const s : string ; args : array of const) ; overload ; 
begin 
    {$IFDEF DEBUG} 
    OutputDebugString (PChar (Format (s , args))) ; 
    {$ENDIF} 
end ;