解决第三方构建系统的分段故障

Solving Segmentation Fault of a Third-Party Build System

本文关键字:分段 故障 系统 第三方 构建 解决      更新时间:2023-10-16

我刚开始用C++开发一个健壮的计算机视觉软件。

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

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

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

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

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

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

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

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

'没有符号匹配0x0000007b602b5c8'

我也尝试过使用信息目标,但没有成功。

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

通常(但不总是)第三方库提供调试版本,在共享对象中保留可见的行号和符号。如果是这种情况,您可以尝试编译链接调试库,而不是发布版本。

否则,你必须想当然地认为第三方的东西是有效的,你必须站在你这边。。。

分段错误通常意味着您试图从尚未创建、已发布或未正确初始化的实例中调用方法。所以你必须开始一次一个地寻找你创建和销毁的所有对象,看看你犯了什么错误。(Valgrind可以帮你)。

祝好运

获得库文件调试信息的典型方式是不是库的替代调试版本,而是一个附加文件,它可以精确地映射到您获得的二进制文件。

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

因此,请尝试为您正在使用的库获取这些调试信息。但只有当您也有最少的头/源文件时,这才有意义。如果没有,你只得到一个符号,但什么都没有。如果lib的源代码不是开源的,那么此时您将迷失方向。

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

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

如果所有这些都无济于事,请为lib创建一个错误报告,并提供一个导致崩溃的最小示例。

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