【问题标题】:Solving Segmentation Fault of a Third-Party Build System解决第三方构建系统的分段错误
【发布时间】:2017-11-09 07:49:18
【问题描述】:

我是使用 C++ 开发强大的计算机视觉软件的新手。

由于我使用的第三方功能的性质保密,我会尽量描述完整。

我正在尝试在 Linux 环境中编译我的源代码。 此源代码使用了许多第三方函数和共享对象。

基本上,我试图将第三方提供的几个 API 组合成一个单一的功能可执行文件。 所有函数在其各自的 API 中都能正常工作。

================================================ ==

长话短说,编译成功后,我在运行可执行文件时遇到了Segmentation Fault作为错误。

之后,用gdb做回溯和调试,发现程序停在了第三方提供的共享对象(.so)文件中的地址0x0000007b602b5c8处。

我尝试使用命令info symbolinfo line *0x0000007b602b5c8 来识别该地址的符号和堆栈帧的变量。 但是,我收到错误

'地址 0x0000007b602b5c8 没有可用的行号信息'

'没有符号匹配0x0000007b602b5c8'

我也尝试使用 info target,但没有成功。

知道如何解决这个分段错误吗?

【问题讨论】:

    标签: c++ linux segmentation-fault computer-vision


    【解决方案1】:

    通常(但并非总是)第三方库提供调试版本,如果您遇到这种情况,可以尝试编译链接调试库而不是发布版本。

    否则你必须理所当然地认为第三方的东西有效,你必须站在你这边......

    分段错误通常意味着您试图从尚未创建或已释放或未正确初始化的实例调用方法。因此,您必须开始一次查看您创建和销毁的所有对象,并查看您是否犯了任何错误。 (Valgrind 可以帮助你)。

    祝你好运

    【讨论】:

    • 我很确定初始化不是问题,因为我只从以前版本的工作代码中添加了几行代码(初始化不同类型的相机)。除此之外,还有什么可以导致分段错误?
    • 分段错误的另一个常见原因是访问超出其边界的数组,但是您的情况似乎与硬件严格相关,并且驱动程序可能有故障(编写驱动程序的程序员会留下错误也)。
    • 我也建议你看看这个问题的第二个答案:stackoverflow.com/questions/2346806/…
    • 我如何确定这种特定类型的分段错误的根本问题?很奇怪,我使用完全相同的函数和变量,但发生了分段错误。
    【解决方案2】:

    获取库文件调试信息的典型方式是不是库的替代调试版本,而是一个附加文件,它与您获得的二进制文件完全映射。

    https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

    因此,请尝试为您正在使用的库获取这些调试信息。但这只有在您还拥有最少的头文件/源文件时才有意义。如果没有,你只会得到一个符号,但什么也没有。如果lib的源不是开源的,那你就迷路了。

    但是您应该首先考虑您自己的编程问题。也许你给了错误的指针、错误的分配内存、数组不足或其他任何给你的 lib 作为参数,然后在 lib 中出现崩溃,但问题出在 你的代码中。

    因此,您应该从内存调试库开始,例如 efence 和其他库(可能是较新的库)。给 valgrind 一个机会!

    如果这一切都没有帮助,请为该库创建一个错误报告,并在其中提供一个导致崩溃的最小示例。

    在此之前,您应该检查是否有更新的版本可用,这些版本已经修复了该错误。也许您可以检查早期的 beta 版本,或者是否开源开发负责人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2013-11-22
      • 1970-01-01
      相关资源
      最近更新 更多