3

我想知道是否有与RStudio中用于 Julia 调试目的的语句等效的browser()语句(我目前正在使用 Juno IDE)。

R函数browser()暂停执行并在调用environment browser时调用一个。因此,原则上,我们可以browser()在代码中的任何位置停在这一行,然后查看当时环境中存储的内容,这对于调试目的来说非常棒。

例如,下面的代码将在i>3. 因此,这正是我们将environment browser在 RStudio 中看到的内容,我们将在代码中观察到i=4这一点。

for (i in 1:5) {
  print(i)  
  if (i>3) {
    browser()
  }
}
[1] 1
[1] 2
[1] 3
[1] 4
Called from: eval(ei, envir)
Browse[1]> 
4

2 回答 2

3

看看Debugger.jl。特别是在源代码中放置断点部分:

有时在源代码中选择何时中断更方便。例如在 Matlab/Octave 中使用键盘,在 R 中使用 browser()。您可以使用@bp 宏来执行此操作

您的 R 示例翻译为 Julia:

julia> using Debugger

julia> @run for i in 1:5
           println(i)
           if i > 3
               @bp
           end
       end
1
2
3
4
Hit breakpoint:
In ##thunk#257() at REPL[4]:1
  9  │         Base.println(i)
 10  │   %10 = i > 3
 11  └──       goto #4 if not %10
●12  3 ─       nothing
>13  4 ┄       @_2 = Base.iterate(%1, %8)
 14  │   %14 = @_2 === nothing
 15  │   %15 = ($(QuoteNode(Core.Intrinsics.not_int)))(%14)
 16  └──       goto #6 if not %15
 17  5 ─       goto #2

About to run: (iterate)(1:5, 4)
1|debug>

这是 Julia 的通用解决方案,Juno IDE 也集成了调试:Debugging,Juno 手册

于 2022-02-11T08:19:13.023 回答
1

Infiltrator.jl@infiltrate似乎与 Julia 中的等价物:

julia> using Infiltrator

julia> for i in 1:5
         println(i)
         if i > 3
           @infiltrate
         end
       end
1
2
3
4
Infiltrating top-level scope at REPL[1]:4:

infil> i
4

与 Debugger.jl 的断点相比,这根本不会减慢程序的执行速度,但代价是不允许您进一步进入程序。

于 2022-02-11T09:52:34.403 回答