【问题标题】:Empty program segfaulting空程序段错误
【发布时间】:2014-07-29 19:24:33
【问题描述】:

我有一个空程序 (module Main where main = return ()),如果我在 cabal 文件中的 build-depends 中包含特定库,则会出现段错误。

库是我自己的,段错误是大黄蜂驱动程序与 opengl 和 haskell 的某种交互(段错误仅在我 optirun 与堆栈中的其他程序一起使用时发生trace 我只看到 libGL.so),但这不是我的问题。

我的问题是,没有代码段错误的程序怎么可能?更准确地说,我的库的哪些代码运行只是因为它在构建依赖中?如何调试这种废话?

编辑。如果我更改列出额外库的顺序,在编译我的库时,问题就会消失。具体来说,我在 sfml-* 之前移动了 GL、GLEW。不过,问题仍然存在。 除了漫不经心地摆弄构建文件之外,我怎么会发现这个?

【问题讨论】:

  • 最明显的候选者是你的库中的静态初始化器或它链接的东西——你调查过吗?
  • @GaneshSittampalam,听起来不错,但我的代码没有,除非 ghc 生成了一些。我确实使用了多个外部库。我将如何检查它们?
  • 我考虑的两种方法是 (a) 获取每个库的代码并检查它,以及 (b) 减少外部库的列表以隔离哪个库触发了问题。
  • 或者在调试器中运行它,看看它在哪里崩溃。我没用过Haskell,但我觉得它一定支持调试?
  • 它不一定会告诉你如何解决它。但这通常是定位问题的良好第一步。不知道为什么订单会有所不同。我能想到的唯一合理的解释是多个库定义了相同的符号。

标签: debugging haskell segmentation-fault


【解决方案1】:

在 Bland GCC 编译中,我注意到 linux 下 75% 的段错误是定义返回类型并且在代码流中没有返回类型的方法。

我想说的是,当某些东西在不确定的情况下出现时,要真正意识到回报,然后给出未使用的名义值……不是“空值”或花哨的东西,只是在游戏中获得的东西。

如果随着你的进步,这不酷,你可以删除或修改它们。

您的消息中没有足够的细节来理解您的上下文,但是如果您可以运行 pdb,GCC 会使用调试信息添加极大的帮助。在它在那里崩溃之后,像 frame 和 bt ( backtrace ) 这样的命令可以帮助你。

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 2020-06-04
    • 2012-06-26
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多