在某些时候,我的大项目的代码开始使用这样的堆栈跟踪出现分段错误运行时错误:
0# std::basic_ios >::widen (__c=10 '\n', this=) at /usr/include/c++/7/bits/basic_ios.h:450
1# std::endl > (__os=. ..) at /usr/include/c++/7/ostream:591
2# std::ostream::operator<< (__pf=, this=) at /usr/include/c++/7/ostream:113
3# main () 在 segfault.cpp:11
last (3#) 总是指向std::cout行,例如std::cout << "hello" << std::endl;
所以我把我的代码放到这个最小的结构中,它仍然会导致同样的错误:
#pragma pack(1)
struct Point {
int x;
};
#include <iostream>
int main()
{
for(;;){
std::cout << "hello" << std::endl;
}
}
这是用g++ -std=c++17 segfault.cpp -o segfault -g -Ofast
命令构建的。
执行以下任何操作都会取消错误:
- 去除
#pragma pack(1)
-Ofast
从g++选项中删除- 移除
for(;;){
(std::cout ...
移出循环) - 前移
#include <iostream>
_#pragma pack(1)
尝试使用g++ 7.4.0和g++ 9.2.1构建(结果相同)。