debugging - 关于 R 中函数的 "Dynamic/interactive"调试的建议?

标签 debugging r

调试函数时我通常使用

library(debug)
mtrace(FunctionName)
FunctionName(...)

这对我来说非常有效。

但是,有时我会尝试调试一个我不知道的复杂函数。在这种情况下,我可以发现在该函数内部还有另一个我想“进入”(“调试”)的函数 - 以便更好地理解整个过程是如何工作的。

因此,一种方法是:

library(debug)
mtrace(FunctionName)
FunctionName(...)
# when finding a function I want to debug inside the function, run again:
mtrace(FunctionName.SubFunction)

问题是 - 是否有一种更好/更智能的方法来进行交互式调试(正如我所描述的),而我可能会丢失?

p.s:我知道有人对 SO 的主题提出了各种问题(请参阅 here )。然而,我无法遇到与我在这里提出的类似的问题/解决方案。

最佳答案

不完全确定用例,但是当您遇到问题时,可以调用函数traceback()。这将显示函数调用通过堆栈的路径,直到遇到问题为止。如果您倾向于从上往下工作,则可以在调用函数之前对列表中给出的每个函数调用 debug。然后你将从头开始经历整个过程。

下面是一个示例,说明如何通过创建一个函数来逐步执行此操作,从而以更系统的方式执行此操作:

walk.through <- function() {
  tb <- unlist(.Traceback)
  if(is.null(tb)) stop("no traceback to use for debugging")
  assign("debug.fun.list", matrix(unlist(strsplit(tb, "\\(")), nrow=2)[1,], envir=.GlobalEnv)
  lapply(debug.fun.list, function(x) debug(get(x)))
  print(paste("Now debugging functions:", paste(debug.fun.list, collapse=",")))
}

unwalk.through <- function() {
  lapply(debug.fun.list, function(x) undebug(get(as.character(x))))
  print(paste("Now undebugging functions:", paste(debug.fun.list, collapse=",")))
  rm(list="debug.fun.list", envir=.GlobalEnv)
}

这是一个使用它的虚拟示例:

foo <- function(x) { print(1); bar(2) }
bar <- function(x) { x + a.variable.which.does.not.exist }
foo(2)

# now step through the functions
walk.through() 
foo(2)

# undebug those functions again...
unwalk.through()
foo(2)

IMO,这似乎不是最明智的做法。更有意义的是,简单地进入出现问题的函数(即最低级别)并向后执行。

我已经在"favorite debugging trick"中概述了这个基本例程背后的逻辑。 .

关于debugging - 关于 R 中函数的 "Dynamic/interactive"调试的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3212540/

相关文章:

java - 是否可以向我没有源代码的类添加断点?

r - 使用包含向量的变量对数据框进行操作

r - 彻底相交 2 个或更多整数向量列表

r - 从POSIXlt中提取日期元素,并放入R中的数据框

r - dplyr 显示 tbl_df 内小 data.frame 的所有行和列

python - 如何在Python中记录缩进错误?

.net - 如何在客户环境 .NET 上调试应用程序

c - scanf 和 printf for 循环输出量不同

c - GDB:自动 'Next' ing?

r - Shiny Datatable中的可点击链接