如何在F#交互式环境中使用断点?

21

我开始研究使用VS2010和F# interactive进行算法方面的一些创意。

因此,我创建了一个名为DebugScript.fsx的文件,在那里编写了一些代码并最终将其发送到F#Int中进行测试。

某个时刻,当我需要捕获一个错误时,我无法在简单的for循环中设置断点:

for i in stringarray do
    printfn "%s" i

当我按下 F9 设置断点时,VS 显示一个带有警告标志的红色圆圈。它的提示是“当前无法命中断点”。

当然,我之前打开了 Debug 菜单 -> 附加到进程... -> Fsi.exe。

我尝试在循环内部放置 Debugger.Break(),但这只是唯一能导致调试器停止运行的那一行代码,没有让我继续调试循环内部的代码的选项。我也没有任何可用的本地变量 :(

也许我漏掉了什么明显的东西?


Debugger.Break() 对我有效。 - Mauricio Scheffer
6个回答

15

在VS2015中现在更加容易了:在 工具->选项->F# 工具 -> F# 交互 -> 调试 中,启用脚本调试 = True

然后重置您的交互式会话,当您想要调试时按下CTRL+ALT+D,并像通常一样发送命令

(或右键单击源文件并选择“在交互式模式下调试”)


12

你无法调试脚本中的代码,但是你可以通过将调试器附加到Fsi.exe进程来调试脚本引用的外部代码。 因此,如果你真的想要在交互窗口中进行调试而不想编写控制台程序,你可以创建一个带有要调试的函数的fs文件并执行以下操作:

  1. 附加调试器

  2. 要么

    • 使用#load (*)引用fs文件
    • 将代码编译为库,并使用#r引用生成的DLL
  3. 设置断点

  4. 从脚本中调用该函数

(*) 在我的VS Ultimate安装上有效,但我无法在另一台安装了VS Shell的机器上重现效果。


2
据我所知,没有直接实现这个的方法。相反的,你需要使用一个 .fs 文件,并在 Visual Studio 中开始调试它。

1
除了kvb的答案之外:我们可以说F# Interactive已经是一种调试器了。你可以逐行(或分区域)输入代码并查看中间结果。你也可以通过在F# Interactive控制台中评估它们来检查绑定值。

0

交互式编程是为了输入小代码片段并评估中间结果,可以将其视为微单元测试。我在使用F#和NUnit方面取得了一些成功,这与使用C#没有什么区别,您可以以相同的方式装饰您的TestFixture和测试用例,然后它就会加载。我确实遇到了一些混合模式程序集的问题,其中NUnit会出错,但总体而言,这是一种更好的测试代码片段的方法。此外,我没有看到将命名空间发送到交互式的方法,只能发送模块。


0

如果您正在使用Visual Studio(不是VSCode!)并在项目上启动调试会话,则有一种设置断点的方法:

如果您有这样的管道:

elements
|> List.map foo

您可以轻松地在管道中的任何行设置断点。您还可以添加“忽略”。

elements
|> List.map foo
|> ignore

并在忽略行处设置断点。然后,您就能够检查管道末尾的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接