仅在满足条件时如何启动调试器
Posted
技术标签:
【中文标题】仅在满足条件时如何启动调试器【英文标题】:How to start debugger only when condition is met 【发布时间】:2018-08-07 02:42:27 【问题描述】:假设我有一个使用整数 i
循环的函数。现在出了点问题,我假设错误发生在i=5
时。现在我可以逐步完成每一步(到目前为止我所做的)。
但现在我读到了 browser
和 debug
的 condition
和 text
参数:
text 浏览器启动时可以检索到的文本字符串 condition 浏览器可以检索到的条件 已输入。
是否可以按照我想要的方式使用参数?
这是一个例子。调试器/浏览器仅应在达到i=5
后启动:
fun <- function(x, y, n)
result <- 0
for (i in 1:n)
# browser(condition = (i == 5)) # does not work
result <- result + i * ( x + y)
return(result)
x <- 2
y <- 3
n <- 10
# debug(fun, condition = (i == 5)) # does not work
debug(fun)
r <- fun(x, y, n)
print(r)
解决办法
if (i == 5) # inside loop of fun()
browser()
正在工作,但我认为可能有更好的东西(函数内没有额外的代码)
【问题讨论】:
text
和 condition
不用于确定您何时进入调试模式(浏览器),而是用于提供信息一旦您进入
【参考方案1】:
您可以在browser()
中使用参数expr
:
fun <- function(x, y, n)
result <- 0
for (i in 1:n)
browser(expr = i == 5)
result <- result + i * ( x + y)
return(result)
如果表达式的计算结果为 TRUE
,它将只打开调用 browser()
的环境。
如果你想使用debug()
:
debug(fun, condition = i == 5)
然后调用函数:
fun <- function(x, y, n)
result <- 0
for (i in 1:n)
result <- result + i * ( x + y)
return(result)
fun(x, y, n)
【讨论】:
你知道condition
参数是什么意思吗?
在文档的Details
部分中,它说“目的......[是] 允许帮助程序在此处插入特定值”
好的。有没有办法用debug()
处理这种情况?【参考方案2】:
使用trace()
的高级功能。
首先,根据参数at =
的帮助页面说明,确定要调试的函数行,指向at = list(c(3, 4))
> as.list(body(fun))
[[1]]
``
[[2]]
result <- 0
[[3]]
for (i in 1:n)
result <- result + i * (x + y)
[[4]]
return(result)
> as.list(body(fun)[[3]])
[[1]]
`for`
[[2]]
i
[[3]]
1:n
[[4]]
result <- result + i * (x + y)
接下来,通过在tracer=
参数中提供一个未计算的表达式来指定条件断点,该表达式在满足特定条件时调用浏览器tracer = quote(if (i == 3) browser())
所以
> trace(fun, tracer = quote(if (i == 3) browser()), at=list(c(3, 4)), print=FALSE)
[1] "fun"
> r <- fun(x, y, n)
Called from: eval(expr, p)
Browse[1]>
debug:
result <- result + i * (x + y)
Browse[2]> i
[1] 3
Browse[2]> result
[1] 15
Browse[2]>
【讨论】:
以上是关于仅在满足条件时如何启动调试器的主要内容,如果未能解决你的问题,请参考以下文章
仅在满足条件时如何应用edgeIgnoringSafeArea?