std::getline()导致segmention fault的奇怪问题.

XSign XSign 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
首先说一下程序逻辑:
程序是提交到hadoop的streaming跑的c++程序.所以需要从stdin读取数据进行处理.而且每一次循环读入的数据都很大可能一行要达到5Mb左右的数据量.
现象是,
当处理少量数据时,程序可以正常结束,但是当处理大量数据时,hadoop报错,subprocess faild with code :11
也就是程序收到signal 11, 最终程序会产生segmention fault错误.
我加-g参数编译(gcc编译器),生成带符号的版本,等seg fault后,gdb -c加载dump文件,然后看堆栈调用,显示全部都是类似如下形式:
0xXXXXXXXX in ?? ()
看样子是调用到什么库里崩的.
然后我将程序逐行打log,发现是崩溃在getline这个c++的库函数调用里.非常不解是怎么回事,哪位高手能解答一下.

下面是程序的部分代码:

int main(int argc, char** argv){
Json::Reader json;
static csh handle;
cs_err cerr;
cerr = cs_open(CS_ARCH_X86, CS_MODE_32, &handle);
while(true){
std::string line;
printf("begin ... \n");
if(std::getline(std::cin, line)){
printf("parsing string ....\n");
size_t pos = line.find_last_of("\t");
printf("first find done ...\n");
if(pos != std::string::npos && line.find("file_content") != std::string::npos){
Json::Value output, json_data;
if(json.parse(line.substr(pos), json_data)){
pos = line.find_first_of("\t");
output["md5"] = line.substr(0, pos);
printf("json parse end ...\n");
std::string zip_buffer = base64_decode(json_data["file_content"].asString());
size_t file_buf_len = 0;
void* file_buf = (void*)unzip(zip_buffer.c_str(), zip_buffer.length(), (size_t*)&file_buf_len);
zip_buffer.clear();
printf("unzip end ... \n");
if(file_buf_len >= sizeof(IMAGE_DOS_HEADER)){
//check "MZ" signature
printf("checking MZ header ... \n");
if(*(unsigned short int*)(file_buf) == 0x5a4d){
PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)file_buf;
//check "PE" signature
printf("checking PE header ... \n");
if(file_buf_len >= (dos_header->e_lfanew + sizeof(IMAGE_NT_HEADERS32)) && *(unsigned int*)((char*)file_buf + dos_header->e_lfanew) == 0x4550){
PIMAGE_NT_HEADERS32 nt_header = (PIMAGE_NT_HEADERS32)((char*)file_buf + dos_header->e_lfanew);
printf("getting section ... \n");
PIMAGE_SECTION_HEADER psh = get_section_header(file_buf, file_buf_len, nt_header->OptionalHeader.AddressOfEntryPoint);
printf("border check ... \n");
if(psh && file_buf_len >= psh->PointerToRawData + psh->SizeOfRawData){
cs_insn* insn;
unsigned int address = nt_header->OptionalHeader.AddressOfEntryPoint + nt_header->OptionalHeader.ImageBase;
size_t count = cs_disasm(handle, \
(uint8_t*)((char*)file_buf+RVA2OFFSET(nt_header->OptionalHeader.AddressOfEntryPoint,psh)), \
psh->PointerToRawData + psh->SizeOfRawData, \
address, 0, &insn);
for(size_t i = 0; i < count; ++i){
char szIns[520] = {0};
sprintf(szIns, "0x%x\t%s\t%s\n", insn[i].address, insn[i].mnemonic, insn[i].op_str);
output["asm"].append(szIns);
}
cs_free(insn, count);
std::cout<<output["md5"].asString()<<std::endl;
}
}
}
}
std::cout<<"free buffer ... "<<std::endl;
if(file_buf) free(file_buf);
}
}
std::cout<<"-------------------------------"<<std::endl;
line.resize(0);
}
}
return 0;
}


下面是崩溃时的log:

begin ...
parsing string ....
first find done ...
json parse end ...
unzip end ...
checking MZ header ...
checking PE header ...
getting section ...
border check ...
318e619313393266d4036b42815b5646
free buffer ...
-------------------------------
begin ...
parsing string ....
first find done ...
json parse end ...
unzip end ...
checking MZ header ...
checking PE header ...
getting section ...
border check ...
860582da12e4205474eb8a0fb49e556b
free buffer ...
-------------------------------
begin ...

[1]+ 段错误 nohup cat /data/sample.bin | ./asm > log.log 2>&1
...全文

相关推荐

C++银行账户系统实战:分层架构、RAII与跨平台文件持久化

C++工程能力的核心在于将语言特性转化为可靠系统设计能力。从面向对象建模到内存安全(RAII)、从跨平台路径处理(std::filesystem)到分层架构(UI/Service/DAO),C++不仅是语法练习,更是对资源管理、异常安全与业务契约的综合实践。银行账户管理作为典型金融场景,天然要求数据一致性、输入校验与容错设计,使其成为训练C++工程思维的理想载体。结合VSCode现代化开发配置与可测试性设计,该实践覆盖编译构建、调试定位、文档表达等完整交付链路,助力学习者跨越‘能跑’到‘可信’的关键门槛。

Vincent8080

现代C++学习指南:从核心概念到实战项目开发

C++作为一门兼具底层硬件控制能力与高级抽象特性的系统级编程语言,其核心价值在于对计算机内存、性能及系统资源的精确掌控。其工作原理基于编译型语言的特性,通过直接操作内存和指针实现高效执行,同时借助面向对象、泛型编程等范式构建复杂软件架构。在技术价值层面,C++为开发者提供了无与伦比的性能优化空间和跨平台能力,使其在游戏引擎、嵌入式系统、高频交易和基础设施软件等对性能有极致要求的领域成为首选。特别是在现代C++标准引入智能指针、移动语义等特性后,开发效率和代码安全性得到显著提升。本文聚焦于C++的学习路径规划

zhengdl126

网易2023校招C++笔试复盘:核心考点与编程题解析

在C++后端开发岗位的校招考察中,扎实的语言基础与算法思维是核心竞争力。理解内存管理、STL容器底层原理、并发机制以及RAII等工程理念,是迈向高效编码的必经之路。掌握快速幂算法和单调栈等经典数据结构的应用,能够显著提升复杂场景下的问题解决能力。这类知识不仅服务于笔试题目的解答,更贯穿于日常C++工程实践、性能优化与调试过程。通过系统梳理C++语法细节、编译环境配置和字符串处理技巧,开发者能建立完整的知识体系。本文以网易2023校招C++开发工程师笔试为切入点,从基础概念到实战代码,全面拆解考点背后的原理与

weixin_34055787

基于混合储能协调控制的三相并网逆变系统设计【附说明文档】

内容概要:本文针对含分布式电源的配电网在故障情况下的恢复问题,提出了一种将网络重构、孤岛划分与检修进度统一考虑的多时段优化模型。该模型以最小化网损和甩负荷惩罚为目标,综合考虑节点功率守恒、支路潮流、电压与容量限制、二阶锥松弛以及拓扑连通性等约束条件,利用混合整数二阶锥规划方法进行求解。通过引入虚拟流变量和大常数松弛技术,有效描述了供电片区的连通性与支路开断状态,避免了传统模型中因设置节点归属变量导致的变量规模膨胀问题。模型在IEEE33节点系统上实现了故障后多时段的重构与孤岛运行方案优化,并通过仿真展示了各时段的网络拓扑、电压分布和负荷恢复情况。文章还对模型的建模细节进行了深入评述,指出了当前实现中存在的简化与不足,如无功处理不完善、电压约束未区分失电节点、缺乏储能与开关操作成本等,并提出了相应的改进建议,为后续研究提供了方向。; 适合人群:电力系统自动化、智能电网及相关专业的研究生、科研人员及从事配电网故障恢复、分布式电源集成、优化调度等领域的工程技术人员。; 使用场景及目标:①用于研究含高比例分布式电源的主动配电网在故障条件下的韧性提升策略;②为实现网络重构与孤岛划分的协同优化提供建模参考;③适用于学术论文复现、课题研究建模与电力系统仿真教学;④目标是掌握基于二阶锥松弛与虚拟流的多时段混合整数规划方法在配电网恢复中的应用。; 阅读建议:建议结合文中引用的参考文献(如汤一达等、陈文兴等的研究)对比阅读,深入理解模型的理论渊源;在复现过程中重点关注虚拟流连通性、大常数松弛与二阶锥转换的实现机制;建议在现有模型基础上逐步加入负荷分级、储能动态、分布式电源出力调控等模块,以构建更贴近实际的完整故障恢复系统。

梦想科研社_研学

国央企创新负责人如何利用平台实现创新资源的精准配置与高效联动?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN
评论 6
收藏 已收藏
分享
返回顶部
XSign
C++ 语言 65,214 成员 250,514 内容