我观察到关于traceback()
的交互式和非交互式R会话之间有所不同,我不明白。对于下面的代码,它会产生错误,但在交互式R会话中,我可以看到回溯信息,而如果我将代码保存到test.R
并通过Rscript test.R
或{{1我再也看不到追溯了:
R -f test.R
在交互式R会话中:
f = function() {
on.exit(traceback())
1 + 'a'
}
f()
非交互式执行:
> f = function() {
+ on.exit(traceback())
+ 1 + 'a'
+ }
> f()
Error in 1 + "a" : non-numeric argument to binary operator
1: f()
我在$ Rscript test.R
Error in 1 + "a" : non-numeric argument to binary operator
Calls: f
No traceback available
Execution halted
中没有看到解释,我想知道是否有办法为非交互式R会话启用追踪功能。谢谢!
答案 0 :(得分:25)
使用其参数的默认值,traceback()
将在.Traceback
中查找名为baseenv()
的对象,以获取有关调用堆栈的信息。它(src/main/errors.c
)的外观(来自.Traceback
)只有在R_Interactive || haveHandler
等条件下,才建议在非交互式会话期间不创建此对象。如果没有名为.Traceback
的对象,您将收到消息“No traceback available”。
但是,通过将非NULL值传递给x
的{{1}}参数,可以从非交互式会话中获取有关调用堆栈的信息。使用非零整数值(表示堆栈中要跳过的调用数),调用c级函数(traceback()
)来调查调用堆栈,而不是查看R_GetTraceback
。
因此,有几种方法可以在非交互式会话中获取回溯信息:
.Traceback
或者,将f = function() {
on.exit(traceback(1))
1 + 'a'
}
f()
设为Brandon Bertelsen建议
options
在两个示例中传递给options(error=function()traceback(2))
的不同值会导致跳过的函数数量不同
在x
示例中,on.exit
会跳过对traceback(1)
的调用。
在示例设置traceback()
中,有一个额外的匿名函数调用options
,该函数应该/也可以跳过。
在OP的示例中,与非交互式会话中的错误情况下提供的自动回溯相比,使用traceback()
获得的信息并不多。但是,对于采用(并传递)参数的函数,使用traceback()
将比非交互式会话中调用堆栈的标准表示提供更多信息。
答案 1 :(得分:2)
还可以转储调试信息并在以后加载它们。 (请参阅关于该主题的良好?debugger
帮助页面和评论)
通过例如:
options(error = quote(dump.frames("testdump", TRUE)))
...
load("testdump.rda")
debugger(testdump)
或
options(error = quote({dump.frames(to.file = TRUE); q(status = 1)}))
答案 2 :(得分:1)
BenBarnes的回答和dshepherd的评论可以挽救生命。如果其中一个参数很大,我将再添加一个参数以避免阻塞屏幕。
options(error=function(){traceback(2,max.lines=3);if(!interactive())quit("no",status=1,runLast=FALSE)})