traceback()用于交互式和非交互式R会话

时间:2012-10-29 05:02:27

标签: r traceback

我观察到关于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会话启用追踪功能。谢谢!

3 个答案:

答案 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)) 的不同值会导致跳过的函数数量不同

  1. x示例中,on.exit会跳过对traceback(1)的调用。

  2. 在示例设置traceback()中,有一个额外的匿名函数调用options,该函数应该/也可以跳过。

  3. 在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)})