debugging 如何在F# interactive中使用断点?

f4t66c6m  于 2023-04-06  发布在  其他
关注(0)|答案(6)|浏览(148)

我已经开始使用VS2010和F# interactive研究算法中的一些想法。
因此,我创建了一个DebugScript.fsx,在那里编写了一些代码,并最终将其发送到F#Int进行测试。
有时候我需要捕捉一个bug,但是我不能在一个简单的for循环中设置断点:

for i in stringarray do
    printfn "%s" i

当我按F9设置断点时,VS显示一个带有警告标志的红圈,提示是“断点当前不会被命中”。
当然,我以前确实打开了调试菜单-〉附加到进程... -〉Fsi.exe
我尝试将Debugger.Break()放入循环中,但这是调试器停止的唯一一行,因此我无法继续调试循环中的行。我也没有任何可用的局部变量:(
也许我错过了一些明显的东西。

kmbjn2e3

kmbjn2e31#

在VS2015中,现在更容易了:在Tools-〉Option-〉F# tools -〉F# interactive-〉Debugging -〉Enable script debugging = True
然后重置您的交互式会话,当您要调试按CTRL+ALT+D和发送命令照常
(or右键单击源文件并选择“交互式调试”)

xmd2e60i

xmd2e60i2#

您不能调试脚本中的代码,但可以通过将调试器附加到Fsi.exe进程来调试脚本中引用的外部代码。因此,如果您确实希望从交互式窗口进行调试,而不想编写控制台程序,则可以创建一个fs文件,其中包含要调试的函数和:
1.附加调试器

  • 要么
  • 使用#load(*)引用fs文件
  • 将代码编译为库并使用#r引用生成的DLL
  • 设置断点
  • 从脚本调用函数

(*)在我的VS Ultimate安装上工作,但我无法在另一台安装了VS Shell的机器上复制

8wigbo56

8wigbo563#

据我所知,没有办法做到这一点。相反,你会想使用一个.fs文件,并开始在Visual Studio中调试它。

zpqajqem

zpqajqem4#

除了KVB的回答:可以说F# Interactive已经是一种调试器。您可以逐行(或逐区域)输入代码并查看中间结果。您还可以通过在F# Interactive控制台中评估绑定来检查绑定的值。

7d7tgy0s

7d7tgy0s5#

交互式是为了给它提供小的代码片段和评估中间结果,把它看作是微单元测试。我已经成功地将nunit与f#一起使用,它与c#没有什么不同,你以同样的方式装饰你的testfixture和测试用例,它会加载。我确实有一些混合模式的问题,nunit会呕吐,但总的来说,这是一个更好的方式imho测试一段代码.此外,我没有看到一种方法来发送一个名称空间到交互式,只有模块.

pvcm50d1

pvcm50d16#

如果您使用的是Visual Studio(而不是VSCode!)并在项目上启动调试会话,则有一种方法可以设置断点:
如果你有一个这样的管道:

elements
|> List.map foo

你可以很容易地在管道中的任何一行设置断点。你可以添加一个“忽略”

elements
|> List.map foo
|> ignore

并在忽略行设置断点。然后你就可以检查管道末端的值了。

相关问题