【问题标题】:Core dump when catching a warning from topological.sort() of R igraph package从 R igraph 包的 topological.sort() 中捕获警告时的核心转储
【发布时间】:2017-01-02 04:36:55
【问题描述】:

我尝试使用igraph::topological.sort() 来获得图的拓扑排序并检查图是否有循环。该函数仅在图形包含循环时发出警告并返回部分结果,但是当图形循环时我必须停止处理,因此我在 tryCatch() 函数中调用 igraph::topological.sort()。 然后 R 解释器被核心转储了。

重现的最少代码:

library(igraph)

# This has a cycle
adjacency_with_cycle <- matrix(c(0,1,0,1,0,0,0,1,0), 3, 3)
g_with_cycle <- graph_from_adjacency_matrix(adjacency_with_cycle)


# This doesn't
adjacency_without_cycle <- matrix(c(0,1,0,0,0,0,0,1,0), 3, 3)
g_without_cycle <- graph_from_adjacency_matrix(adjacency_without_cycle)

# Codes below moves
## Only warns on the graph with cycle.

topological.sort(g_with_cycle)
## No problem on the acyclic graph.

topological.sort(g_without_cycle)

## Call in tryCatch. but no warning
tryCatch({
  topological.sort(g_without_cycle)
  },
  warning = function (w) stop())

# Just a tryCatch
tryCatch({warning("warn")}, warning = function (w) stop("stop"))


# Core dumped when catching warning
tryCatch({
  topological.sort(g_with_cycle)
  },
  warning = function (w) stop())    My environments are:

我的环境是(两个都出现问题)

  • Windwos 10,MRO R 3.3.1,igraph 1.0.1
  • Manjaro Linux,R 3.3.2,igraph 1.0.1

鉴于以上,我想知道

  • 这是igraph 包的问题,​​还是其他问题?
  • 为什么会出现这种情况? tryCatch() 在捕获警告方面做了什么?

【问题讨论】:

    标签: r try-catch warnings igraph


    【解决方案1】:

    如果您使用options(warn=2) 将警告转换为错误,您还会获得中止和核心转储。这是 igraph 中的一个问题;您应该向 igraph 维护者报告。

    【讨论】:

    • 谢谢。我会把它报告给维护者。我仍然想知道,一般来说,捕获警告是如何以及为什么会导致段错误或任何 R 解释器无法管理的。
    • R 对行为不端的用户 C 代码无能为力。在 Linux 上以gdb 运行并查看topological.sort 的R 代码会告诉您,在这种情况下,从on.exit 表达式调用的R_igraph_finalizer C 函数正在调用错误指针上的free。使用tryCatch 捕获错误或使用options(warn=2) 将警告转换为错误会导致运行on.exit 代码的跳转。 igraph 需要确保R_igraph_finalizer 可以安全运行,即使发生这种跳转。现在交给 igraph 维护者。
    • 根据我现在的理解,如果在tryCath()options(warn=2) 中调用,R 是否会在运行C 实现部分之前设置信号处理程序?因此,如果信号处理程序做错了什么,R 与它无关。我不知道 R 如何用 C 做事,但它变得更清楚了。感谢您提供详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2013-09-22
    相关资源
    最近更新 更多