首先说一下程序逻辑:
程序是提交到hadoop的streaming跑的c++程序.所以需要从stdin读取数据进行处理.而且每一次循环读入的数据都很大可能一行要达到5Mb左右的数据量.
现象是,
当处理少量数据时,程序可以正常结束,但是当处理大量数据时,hadoop报错,subprocessfaildwithcode:11
也就是程序收到signal11,最终程序会产生segmentionfault错误.
我加-g参数编译(gcc编译器),生成带符号的版本,等segfault后,gdb-c加载dump文件,然后看堆栈调用,显示全部都是类似如下形式:
0xXXXXXXXXin??()
看样子是调用到什么库里崩的.
然后我将程序逐行打log,发现是崩溃在getline这个c++的库函数调用里.非常不解是怎么回事,哪位高手能解答一下.
下面是程序的部分代码:
intmain(intargc,char**argv){
Json::Readerjson;
staticcshhandle;
cs_errcerr;
cerr=cs_open(CS_ARCH_X86,CS_MODE_32,&handle);
while(true){
std::stringline;
printf("begin...\n");
if(std::getline(std::cin,line)){
printf("parsingstring....\n");
size_tpos=line.find_last_of("\t");
printf("firstfinddone...\n");
if(pos!=std::string::npos&&line.find("file_content")!=std::string::npos){
Json::Valueoutput,json_data;
if(json.parse(line.substr(pos),json_data)){
pos=line.find_first_of("\t");
output["md5"]=line.substr(0,pos);
printf("jsonparseend...\n");
std::stringzip_buffer=base64_decode(json_data["file_content"].asString());
size_tfile_buf_len=0;
void*file_buf=(void*)unzip(zip_buffer.c_str(),zip_buffer.length(),(size_t*)&file_buf_len);
zip_buffer.clear();
printf("unzipend...\n");
if(file_buf_len>=sizeof(IMAGE_DOS_HEADER)){
//check"MZ"signature
printf("checkingMZheader...\n");
if(*(unsignedshortint*)(file_buf)==0x5a4d){
PIMAGE_DOS_HEADERdos_header=(PIMAGE_DOS_HEADER)file_buf;
//check"PE"signature
printf("checkingPEheader...\n");
if(file_buf_len>=(dos_header->e_lfanew+sizeof(IMAGE_NT_HEADERS32))&&*(unsignedint*)((char*)file_buf+dos_header->e_lfanew)==0x4550){
PIMAGE_NT_HEADERS32nt_header=(PIMAGE_NT_HEADERS32)((char*)file_buf+dos_header->e_lfanew);
printf("gettingsection...\n");
PIMAGE_SECTION_HEADERpsh=get_section_header(file_buf,file_buf_len,nt_header->OptionalHeader.AddressOfEntryPoint);
printf("bordercheck...\n");
if(psh&&file_buf_len>=psh->PointerToRawData+psh->SizeOfRawData){
cs_insn*insn;
unsignedintaddress=nt_header->OptionalHeader.AddressOfEntryPoint+nt_header->OptionalHeader.ImageBase;
size_tcount=cs_disasm(handle,\
(uint8_t*)((char*)file_buf+RVA2OFFSET(nt_header->OptionalHeader.AddressOfEntryPoint,psh)),\
psh->PointerToRawData+psh->SizeOfRawData,\
address,0,&insn);
for(size_ti=0;i
下面是崩溃时的log:
begin...
parsingstring....
firstfinddone...
jsonparseend...
unzipend...
checkingMZheader...
checkingPEheader...
gettingsection...
bordercheck...
318e619313393266d4036b42815b5646
freebuffer...
-------------------------------
begin...
parsingstring....
firstfinddone...
jsonparseend...
unzipend...
checkingMZheader...
checkingPEheader...
gettingsection...
bordercheck...
860582da12e4205474eb8a0fb49e556b
freebuffer...
-------------------------------
begin...
[1]+段错误nohupcat/data/sample.bin|./asm>log.log2>&1
分 -->
|