4

我是一名长期的 Delphi 开发人员,过去我在开发时使用第三方工具进行日志记录和调试(称为 Smart Inspect),但是现在我已经升级到 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) 之类的愚蠢事情;

如果某处(或文章)有视频,那么我很乐意阅读。

有没有办法观察/输出变量的值。

4

6 回答 6

9

如果您只想使用 IDE 调试器,请执行以下操作:

  • 在某处放置断点
  • 右键单击断点圆圈并选择“断点属性...”
  • 按“高级”按钮显示更多选项
  • 取消选中“中断”复选框
  • 然后使用“Log message”和“Eval expression”编辑框输入跟踪值

此类消息将发送到“事件日志”调试器窗格。右键单击窗格并选择“属性”。在那里,您可以根据需要过滤(“消息”)/突出显示(“颜色”)跟踪消息。

于 2010-12-09T20:14:40.433 回答
8

好吧,Delphi XE 带有 CodeSite 日志记录,但我感觉您是在谈论调试器本身。

如果在例程中放置断点,它会在遇到它时中断到调试器。从那里,您在 IDE 的左侧有一个 Local Variables 窗格和一个 Watches 窗格。局部变量将显示所有局部变量的值,而 Watches 允许您设置将跟踪其值的表达式。

您还可以使用 Inspect ( ) 获得类似于手表的信息,但包含更详细的信息(尤其是对象等结构化类型Alt-F5)。此外,Evaluate/Modify ( Ctrl-F7) 将允许您输入表达式并计算它们。它不像 Inspect 那样详细,但它为您提供了更多的灵活性。

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

于 2010-12-09T18:46:30.287 回答
5

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

2) 您可以使用 CodeSite Express。我推荐CodeRage 5的视频作为使用 CodeSite 的起点

于 2010-12-09T18:34:02.907 回答
1

其他答案都是正确的。

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

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

您还可以使用 OutputDebugString(PChar(s)) 将任何字符串输出到调试器。由于它可以包含您想要的任何内容,因此这是一种非常好的调试方式,但不会向最终用户显示内容。

在我的许多应用程序中,我有一个特殊的跟踪缓冲区,它是循环的(也就是说,它只保留最后 500 行左右)。每当我看到问题时,我不仅会获得堆栈回溯,还会保存内存中的跟踪日志,因此我对问题之前发生的事情有一些历史记录。

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

于 2010-12-09T22:10:09.783 回答
0

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

于 2010-12-09T21:30:36.163 回答
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 ;
于 2011-04-15T17:05:31.630 回答