C++ c++;“中的分段错误”;“空的”;main(在非空项目中)

C++ c++;“中的分段错误”;“空的”;main(在非空项目中),c++,segmentation-fault,runtime-error,C++,Segmentation Fault,Runtime Error,我一直在和一位同事开发一个应用程序,从CVS中提取最后一个版本后,它停止了工作。。。以一种有趣的方式 它开始产生一个分段错误(是的,这一点也不奇怪) 我正在寻找造成分割错误的人。我的问题是我似乎把范围缩小到。。。没有人 此时,主视图如下所示: //lots of commented includes int main(int argc, char** argv) { // some commented code exit(0); } 所以现在我基本上有: 一个相当长

我一直在和一位同事开发一个应用程序,从CVS中提取最后一个版本后,它停止了工作。。。以一种有趣的方式

它开始产生一个分段错误(是的,这一点也不奇怪)

我正在寻找造成分割错误的人。我的问题是我似乎把范围缩小到。。。没有人

此时,主视图如下所示:

//lots of commented includes
int main(int argc,  char** argv)
{
      // some commented code
      exit(0);
}
所以现在我基本上有:

  • 一个相当长的cmakelist.txt,包含相当多的类、外部库
  • 一个用cmake生成的makefile,它允许我编译所有的东西而不必抱怨
  • 一个空的主函数(至少在此时),没有包含
但是当我运行代码时,仍然会出现分段错误。因此,代码编译和链接时没有抱怨,但在运行时会产生分段错误

当我尝试使用Clion内置的调试器(我很确定它是GDB)调试代码时,它会启动,输出sigsev消息,然后继续运行,直到输出exit(0)(即使我将代码中的exit(0)更改为exit(1),它仍然只输出exit(0))

<>我有几年调试C++代码的经验,但在这种情况下我不知道该怎么继续下去,我知道我没有给出足够的细节来获得一个特别的答案,但是任何想法都是非常值得赞赏的。p> 更多详情:

  • 我已经检查过,我仍然可以使用CLION编译和运行hello world示例,因此没有重大的配置问题,我甚至可以编译和运行以前版本的代码

  • 这两个版本之间的差异很大,但不包括新的外部库,只有一些我们自己开发的新类

  • 我一直在研究这个问题,看起来来自包含类的静态创建者函数可能是个问题,但由于我没有包含,我相信我应该是安全的,对吗


提前感谢您的帮助。

好吧,我设法解决了这个问题。我在这里发布了一些详细信息,以防对某人有所帮助

我正在使用使用boost的点云库。我试图重新安装这两个,但都没有成功。然后我决定改变PCL的版本,希望这能起到作用

我过去常常下载、编译和安装一个不同于ubuntu系统的PCL版本。这就解决了问题。但是,问题似乎不在库本身,而是在它的一些依赖项中

具体来说,我在尝试安装libflann1包时遇到了麻烦

我通过安装libflann-dev解决了这个问题

做了这些之后,我又回到了(目前是1.7.0),一切都很顺利

我仍然不知道为什么应用程序在这个特定的时刻失败,我猜代码开始使用一些影响未正确安装的部分的功能

总而言之,我了解到链接库(即使不包括它们)在初始化时会产生运行时分段错误,我从valgrind(感谢Dac Saunders!)那里得到了有问题的库的提示,并设法修复了一个错误的安装


现在回到编程上来,谢谢你的帮助

好吧,我设法解决了这个问题。我在这里发布了一些细节,以防对某人有所帮助

我正在使用使用boost的点云库。我试图重新安装这两个,但都没有成功。然后我决定改变PCL的版本,希望这能起到作用

我过去常常下载、编译和安装一个不同于ubuntu系统的PCL版本。这就解决了问题。但是,问题似乎不在库本身,而是在它的一些依赖项中

具体来说,我在尝试安装libflann1包时遇到了麻烦

我通过安装libflann-dev解决了这个问题

做了这些之后,我又回到了(目前是1.7.0),一切都很顺利

我仍然不知道为什么应用程序在这个特定的时刻失败,我猜代码开始使用一些影响未正确安装的部分的功能

总而言之,我了解到链接库(即使不包括它们)在初始化时会产生运行时分段错误,我从valgrind(感谢Dac Saunders!)那里得到了有问题的库的提示,并设法修复了一个错误的安装


现在回到编程上来,谢谢你的帮助

这也可以在编译/链接到程序中的其他cpp文件或库中。不仅包括文件。因此,如果你有一些全局/静态变量,这也会导致这种情况。调试器会指出故障的原因,所以gdb输出sigsegv消息并继续执行?真奇怪。gdb在其他程序中的行为是否应该如此?(试试
intmain(){*(int*)nullptr;}
或类似的东西。)你的问题与CMake或CLion有什么关系?请删除这些标记。您可以使用工具Valgrind调查segfault,然后您将获得实际行号。因此,我询问Valgrind,以下是输出结果:地址处映射区域的权限不正确。。。boost::math::lanczos::lanczos_初始值设定项::init::init()(在/usr/lib/libpcl_sample_.so.1.7.2中)由0xA64A6BD:???(在/usr/lib/libpcl_sample_consenses.so.1.7.2中)0x4010109:call_init.part.0(dl init.c:78)0x40101F2:call_init(dl init.c:36)0x40101F2:_dl_init(dl init.c:126)我想这是PCL和boost之间的问题,我现在检查一下。谢谢你的建议!这也可以在编译/链接到程序中的其他cpp文件或库中。不仅包括文件。因此,如果你有一些全局/静态变量,这也会导致这种情况。调试器会向您指出导致故障的原因