我很擅长用C ++开发一个强大的计算机视觉软件。
由于我使用的第三方功能的机密性,我将尝试尽可能完整地描述它。
我正在尝试在Linux环境中编译我的源代码。 此源代码使用许多第三方函数和共享对象。
基本上我试图将第三方提供的几个API组合成一个功能可执行文件。 所有功能在各自的API中都可以正常工作。
=============================================== ==
长话短说,在成功编译之后,我在运行可执行文件时遇到了Segmentation Fault作为错误。
之后,使用gdb进行回溯和调试,我发现程序在第三方提供的共享对象(.so)文件的地址0x0000007b602b5c8
处停止。
我尝试使用命令info symbol
和info line *0x0000007b602b5c8
来识别该地址的符号和堆栈帧的变量。
但是,我收到错误
'没有可用于地址0x0000007b602b5c8'
的行号信息
和
'没有符号匹配0x0000007b602b5c8'
我尝试使用信息目标也没有成功。
知道如何解决这个分段错误错误吗?
答案 0 :(得分:0)
通常(但不总是)第三方库提供调试版本,在共享对象中保留行号和符号,如果是这种情况,您可以尝试编译链接调试库而不是发布版本。
否则你必须理所当然地认为第三方的东西是有效的,你必须站在你身边......
分段错误通常意味着您尝试从尚未创建或已经释放或未正确初始化的实例调用方法。所以你必须开始一次查看你创建和销毁的所有对象,看看你做错了什么。 (Valgrind可以帮助你)。
祝你好运答案 1 :(得分:0)
获取库文件调试信息的典型方法是不是库的替代调试版本,而是另一个文件,它完全映射到您获得的二进制文件。
https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html
因此,尝试获取您正在使用的库的这些调试信息。但这只是意义,如果你还有最少的头文件/源文件。如果没有,你只会得到一个符号,但却什么都没有。如果lib的源不是开源的,那么此时你就会丢失。
但是你首先要考虑自己的编程问题。也许你给错误的指针,错误的分配内存,不足的数组或者你的lib作为参数的任何东西,然后在lib中发生崩溃,但问题出在你的代码中。
所以你应该从内存调试libs开始,比如efence和其他人(可能是新的)。给valgrind一个机会!
如果所有这些都无济于事,请为lib创建一个错误报告,并提供一个最小的示例,以便导致崩溃。
在此之前,您应该检查是否有更新的版本,已经修复了该错误。也许你可以检查早期的beta版本,或者如果开源是开发的负责人。