使用Boost Gzip Filter触发Segmentation Fault问题排查求助
问题:Boost 1.79.0 gzip_decompressor 触发段错误
环境:Ubuntu 20.04.3 LTS,Boost 1.79.0(通过Conan安装)
测试代码:
#include <boost/filesystem.hpp> #include <boost/iostreams/filter/gzip.hpp> #include <boost/iostreams/filtering_streambuf.hpp> #include <fstream> #include <iostream> #include <string> using namespace std; using namespace boost::filesystem; int main(int argc, char** argv) { boost::iostreams::filtering_streambuf<boost::iostreams::input> inbuf; inbuf.push(boost::iostreams::gzip_decompressor()); return 0; }
报错信息:
Segmentation fault (core dumped)
堆栈跟踪:
==8215==The signal is caused by a READ memory access. #0 0x56360f5f70c8 in boost::iostreams::detail::gzip_header::reset() (/root/build/bin/test+0x900c8) #1 0x56360f5a14a4 in boost::iostreams::detail::gzip_header::gzip_header() /root/.conan/data/boost/1.79.0/_/_/package/adf48b8e4446dcb68f440fe42ff08878d5c7feed/include/boost/iostreams/filter/gzip.hpp:327 #2 0x56360f5a29c0 in boost::iostreams::basic_gzip_decompressor<std::allocator<char>>::basic_gzip_decompressor(int, long) /root/.conan/data/boost/1.79.0/_/_/package/adf48b8e4446dcb68f440fe42ff08878d5c7feed/include/boost/iostreams/filter/gzip.hpp:736 #3 0x56360f59c091 in main /root/playground/main.cpp:14 #4 0x7f3063f530b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x240b2) #5 0x56360f59bedd in _start (/root/build/bin/test+0x34edd)
问题分析与修复
核心原因
段错误发生在gzip_header构造函数调用reset()时,本质是Boost.IOStreams的gzip组件依赖zlib库,但编译/链接过程中zlib依赖未正确处理。从堆栈看,gzip_header::reset()访问了未初始化内存,说明zlib相关结构体或函数指针未正确绑定,大概率是链接时未关联zlib库,或是Conan安装的Boost包未启用zlib依赖。
修复步骤
1. 修正编译链接命令
确保编译时链接zlib库,在g++命令中添加-lz参数:
g++ main.cpp -o test -lboost_filesystem -lboost_iostreams -lz
2. 验证Conan的Boost包配置
检查Conan安装Boost时是否启用zlib依赖,若使用默认配置可能未自动关联,需在依赖配置中明确指定:
# conanfile.txt 或 conanfile.py 中添加 [requires] boost/1.79.0 zlib/1.2.13 [options] boost:iostreams=zlib
重新安装依赖:
conan install . --build=missing
3. 完善测试代码逻辑
原代码仅创建gzip_decompressor并推入流缓冲区,但未关联实际输入流(如文件),即使修复链接问题,后续使用仍会出错。完整的gzip文件读取示例:
#include <boost/iostreams/filter/gzip.hpp> #include <boost/iostreams/filtering_streambuf.hpp> #include <fstream> #include <iostream> #include <string> int main(int argc, char** argv) { if (argc != 2) { std::cerr << "Usage: " << argv[0] << " <gzip_file>" << std::endl; return 1; } std::ifstream file(argv[1], std::ios_base::binary); if (!file) { std::cerr << "Failed to open file: " << argv[1] << std::endl; return 1; } boost::iostreams::filtering_streambuf<boost::iostreams::input> inbuf; inbuf.push(boost::iostreams::gzip_decompressor()); inbuf.push(file); // 读取解压内容 std::string line; std::istream in(&inbuf); while (std::getline(in, line)) { std::cout << line << std::endl; } return 0; }
验证
编译修正后的代码,传入有效gzip文件路径运行,若能正常输出解压内容则说明问题解决。
内容的提问来源于stack exchange,提问作者mm.
相关产品推荐
相关产品推荐

