r - 在 R 的浏览器中添加跟踪/断点

标签 r debugging trace

编辑 :为了记录,接受的答案有一个显着的下降,因为它在重新调试时重新执行函数中的前 n 行代码。这可能没问题,但是当这些代码行包​​含副作用(例如,数据库更新)和/或长时间计算时,发生的事情就很明显了。我不相信 R 提供了“正确”地做到这一点的能力(就像其他一些语言一样)。真可惜。

一些调试器允许您在调试器中动态添加断点。在 R 中可以实现该功能吗?一个例子:

quux <- function(..)
{ # line 1
  "line 2"
  "line 3"
  "line 4"
  "line 5"
  "line 6"
}

trace("quux", tracer = browser, at = 3)
# [1] "quux"
quux()
# Tracing quux() step 3 
# Called from: eval(expr, envir, enclos)
# Browse[1]> 
# debug: [1] "line 3"

在调试时,我相信我想在代码中向前跳。想象一下这个函数有几百行代码,我不想单步执行它们。

我希望能够做到这一点,并从当前行跳转到下一个有趣的行,但不幸的是它只是继续超出了功能。
# Browse[2]>
trace("quux", tracer = browser, at = 5)
# [1] "quux"
# Browse[2]>
c    
# [1] "line 6"
# # (out of the debugger)
trace call while 在调试器中只是将断点添加到原始(全局)函数中,如图所示如果我立即再次调用该函数:
quux()
# Tracing quux() step 5 
# Called from: eval(expr, envir, enclos)
# Browse[1]> 
# debug: [1] "line 5"

我尝试在浏览器中同时设置两者(at=c(3,5)),但这只是为我退出调试器并再次调用该函数时设置这些行。

我猜这与 trace 的函数有关。正在附加断点。调查 trace (和 .TraceWithMethods ),我想我需要设置 where ,但我无法弄清楚如何让它在调试功能上设置新的断点/跟踪。

(更大的图景是我正在对一个处理由 kafka 主导的数据流的函数进行故障排除。我的两个选项目前是(a)使用更合适的跟踪重新启动该函数,但这需要我清除并重新启动数据流也是如此;或者 (b) 在调试器中逐行执行,当有数百行代码时很乏味。)

最佳答案

这可能是一种解决方案。首先按照你的帖子做:

> quux <- function(..)
+ { # line 1
+   x <- 1   # added for illustration
+   "line 3"
+   "line 4"
+   "line 5"
+   print(x) # added for illustration
+   "line 7"
+   "line 8"
+ }
> 
> trace("quux", tracer = browser, at = 4)
[1] "quux"
> quux()
Tracing quux() step 4 
Called from: eval(expr, p)
Browse[1]> n
debug: [1] "line 4"

接下来,我们在调试器中进行如下操作:
Browse[2]> this_func <- eval(match.call()[[1]])       # find out which funcion is called
Browse[2]> formals(this_func) <- list()               # remove arguments
Browse[2]> body(this_func) <- body(this_func)[-(2:4)] # remove lines we have evalutaed   
Browse[2]> trace("this_func", tracer = browser, 
+                at = 8 - 4 + 1)                      # at new line - old trace point
Tracing function "this_func" in package "base"
[1] "this_func"
Browse[2]> this_func                                  # print for illustration
function () 
{
    "line 5"
    print(x)
    "line 7"
    "line 8"
}
Browse[2]> environment(this_func) <- environment()    # change enviroment so x is present
Browse[2]> this_func()                                # call this_func
[1] 1
[1] "line 8"

缺点是我们回到 "line 5"在对 quux 的原始调用中在我们退出对 this_func 的调用之后.此外,我们必须跟踪最后一个 at值(value)。我们也许可以从另一个函数中得到这个?

关于r - 在 R 的浏览器中添加跟踪/断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38105379/

相关文章:

debugging - Visual Studio Code - Golang 调试 : How to see the value of a pointer time. 时间?

oracle11g - 如何查看 Oracle 数据库 11g r2 中最后执行的 SQL 语句?

c# - 如何调试/跟踪 System.Web.Services.Protocols.SoapHttpClientProtocol.invoke(来自 Windows 移动设备)?

r - .Rnw 文件中的knitr 语法高亮显示 (LaTeX)

mysql - 无法从本地 RStudio 连接到 MySQL 数据库

r - sum 与 unite 函数 tidyr

java - 在 LeetCode 质数挑战赛中找不到我的程序的修复程序

用同一数据框中另一列的值替换单元格的 NA 值

android - 在一个 Visual Studio 上同时调试浏览器中的 API 和模拟器中的 Android 应用程序

android - 是否可以在没有 JNI 的情况下直接从 native 代码记录 Android systrace 事件?