为啥使用 gdb 启动 C++ 程序时出现分段错误?

Posted

技术标签:

【中文标题】为啥使用 gdb 启动 C++ 程序时出现分段错误?【英文标题】:Why do I have a segmentation fault when starting my C++ program with gdb?为什么使用 gdb 启动 C++ 程序时出现分段错误? 【发布时间】:2014-05-23 16:34:44 【问题描述】:

我有一个 g++ 项目,想使用 gdb 对其进行调试。以程序作为参数打开 gdb 会产生以下输出:

Reading symbols from <my_app_name>...Segmentation fault (core dumped)

编译标志

-c -Wall -Werror -Wfatal-errors -Wpedantic -std=c++11 -g

链接标志

-lssl -lcrypto -pthread -luuid -rdynamic

我的可执行文件大小为 2,141,712,其中包含调试信息 “top 命令”显示 3,417,168 个可用内存。

$ g++ --version
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2

$ gdb --version
GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7

我过去在gdb方面的经验有限,我打算在这个项目中使用gdb,不幸的是,由于我的可执行文件启动时gdb分段错误,调试体验会很困难。有人可以帮忙吗?

我也问过这个问题Ask Ubuntu,但我的问题在那里结束了,因为它更适合 Stack Overflow。

【问题讨论】:

【参考方案1】:

乍一看:

您的编译标志似乎缺少前导破折号:

-c std=c++11 -g

应该是:(add leading dash in front of std=c++11)

-c -std=c++11 -g

您的链接标志:

-lssl -lcrypto -pthread -luuid -std=c++11-rdynamic

应该是:(add space between -std=c++11 and -rdynamic)

-lssl -lcrypto -pthread -luuid -std=c++11 -rdynamic

请注意,您不需要两次使用 -std=c++11 选项(配置和链接标志)。

使用更新的标志再试一次。

【讨论】:

抱歉@iomix,我在重新复制 CXXFLGS 时输入了一个错字。我已经用正确的标志编辑了原始问题。在 -std=c++11 之前,我确实有领先优势。我还从链接标志中删除了 -std=c++11,感谢您的提示。仅供参考,删除链接标志 -std=c++11 后,我仍然会收到从 gdb 加载项目的段错误。

以上是关于为啥使用 gdb 启动 C++ 程序时出现分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 索引程序中使用向量时出现分段错误 11

运行 C++ 代码时出现分段错误

创建邻接列表时出现分段错误

为啥在尝试使用指针访问结构时出现此分段错误?

从 C 调用汇编函数时出现分段错误错误

在 C++ 中操作向量时出现分段错误