g++编译器:段错误处理

G++ compiler: Segfault handling

本文关键字:错误 处理 编译器 段错误 g++      更新时间:2023-10-16

我正在做一个项目,我调用一个触发段错误的函数。我修复了这个问题,但在这个过程中,我注意到以下内容:

当我的代码的格式是;

main(){
  ...
  std::cout << "Looking for segfaultn"; // this does not print
  buggyFunction(); // crashes in here
  ...
}
buggyFunction(){
  ...
  thing_that_causes_segfault;
  ...
}

"Looking for segfault"这行没有打印到STD,程序在buggyFunction中崩溃。很好,但是当我在buggyFunction();

中添加计算行时
main(){
  ...
  std::cout << "Looking for segfaultn"; // this now *does* print
  buggyFunction(); 
  ...
}
buggyFunction(){
  ...
  std::cout << "Now we're INSIDE buggy functionn"; // this prints too
  thing_that_causes_segfault;
  ...
}

在有bug的函数中,两行都输出(然后崩溃)。

为什么我们在输出中看到这种差异,取决于这个额外的输出调用的添加?它是否与流的处理有关,还是其他什么?我使用g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3。

这样做的原因是cout有一个缓冲区,它只会在缓冲区满时传递给系统函数并写入控制台。第二次使用cout时恰好缓冲区溢出,因此它调用操作系统并清空缓冲区。如果你想保证输出已经离开缓冲区,你必须使用std::flush。您既可以结束一行,也可以使用std::endl刷新缓冲区。

因为您的行可能不会立即打印出来,因为它被缓存并且缓存没有"刷新"。std::endl是换行符+刷新,因此强制立即输出:

std::cout << "Looking for segfault" << std::endl;

这与缓冲有关。写入cout的内容被附加到内部缓冲区,该缓冲区只会周期性刷新。您可以通过将std::flush写入流来显式刷新缓冲区,或者将"n"替换为<< std::endl