memcpy core dump bus error
size:15383 make: *** [run] Bus error (core dumped)
请教关于总线错误(Bus error) 和 定位处理问多线程Mmap文件Bus Error及解决的办法
为什么程序会出现Bus Error?
memcpy出错core掉?
算了,先放弃了。
:load(std::string filename) { /* *ifstream in(filename); *string line; *string chl="\n"; *int i=0; *if(in){ * while(getline(in,line)){ * data_.push_back(line);//store to data_ * data_.push_back(chl);//store a "\n" * } *} *else{ * cout << "File Not Exist" << endl; *} *in.close(); */ int src_fd; int dst_fd; const char *fn_i = filename.c_str();//filename in -->fn_i if((src_fd=open(fn_i,O_RDONLY))<0) { printf("%s open failed!\n",fn_i); return ; } long long size = lseek(src_fd, 0, SEEK_END); assert(size != 0); printf("data_:%p\nsize:%lld\n",data_,size); data_ = (char *) mmap( NULL, size ,PROT_READ, MAP_PRIVATE, src_fd, 0 ); printf("data_:%p\nsize:%lld\n",data_,size); printf("oooooooooooooooooooo\n"); const char* fn_o="output_file.data"; if((dst_fd=open(fn_o,O_RDWR | O_CREAT | O_TRUNC,S_IRWXU ))<0) { printf("%s open failed! \n",fn_o); return ; } char* dst_ptr=NULL; //src_ptr=mmap(NULL,size,PROT_READ,MAP_PRIVATE,src_fd,0); dst_ptr=(char *)mmap(NULL,size,PROT_READ | PROT_WRITE,MAP_SHARED,dst_fd,0); printf("data_:%p\ndst_ptr:%p\nsize:%lld\n",data_,dst_ptr,size); if(dst_ptr==MAP_FAILED) { printf("mmap error:%s\n",strerror(errno)); return; } printf("pppppppppppp %d,%d\n",sizeof(dst_ptr),sizeof(data_)); //printf("pppppppppppp %d,%d\n",strlen(dst_ptr),strlen(data_)); //mlock(dst_ptr,size); //cout<<data_<<endl; memmove (dst_ptr,data_,size); printf("oooooooooooooooooooo\n"); //munlock(dst_ptr,size); munmap(data_,size); munmap(dst_ptr,size); close(src_fd); close(dst_fd); }一直make: *** [run] Bus error (core dumped)
gdb 结果:
Program received signal SIGBUS, Bus error. 0x00000000004024bd in std::char_traits<char>::length ( __s=0x7ffff7ff0000 <error: Cannot access memory at address 0x7ffff7ff0000>) at /usr/include/c++/5/bits/char_traits.h:267 267 { return __builtin_strlen(__s); } (gdb)我也是醉了,写法有问题,,,, size那块。
下面这个已经正常了。
不要纠缠一个写法,,,,多试
https://blog.csdn.net/nocodelife/article/details/8647499 mmap实现大文件复制 2k
:load(std::string filename) { /* *ifstream in(filename); *string line; *string chl="\n"; *int i=0; *if(in){ * while(getline(in,line)){ * data_.push_back(line);//store to data_ * data_.push_back(chl);//store a "\n" * } *} *else{ * cout << "File Not Exist" << endl; *} *in.close(); */ //data_ = (char *) mmap( NULL, size ,PROT_READ, MAP_PRIVATE, src_fd, 0 ); int fd_r,fd_w; char * p_w,*p_r ; char buf[BUF_SIZE]; int length_r,length_w,len = 0; int off= 0; const char *filename_read = filename.c_str();//filename fd_r = open(filename_read,O_RDWR); assert(fd_r); const char* filename_write="output_letter.data"; fd_w = open(filename_write,O_RDWR|O_CREAT|O_TRUNC,0644); assert(fd_w); length_r = lseek(fd_r,0,SEEK_END); length_w = lseek(fd_w,length_r - 1,SEEK_CUR); write(fd_w,"0",1); lseek(fd_w,0,SEEK_SET); lseek(fd_r,0,SEEK_SET); //assert(p_w); while(1) { p_r =(char*) mmap(NULL,BUF_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd_r,off); p_w = (char*)mmap(NULL,BUF_SIZE,PROT_WRITE,MAP_SHARED,fd_w,off); memcpy(p_w,p_r,BUF_SIZE); off += BUF_SIZE; if((off+BUF_SIZE) >= length_r) { p_r = (char*)mmap(NULL,length_r - off ,PROT_READ|PROT_WRITE,MAP_SHARED,fd_r,off); p_w = (char*)mmap(NULL,length_r - off,PROT_WRITE,MAP_SHARED,fd_w,off); memcpy(p_w,p_r,length_r -off ); munmap(p_r,length_r - off); munmap(p_w,length_r - off); break; } } close(fd_r); close(fd_w); }BUG复现了,把write(fd_w,"0",1); 去掉。这个问题困扰了我一整天。。。
知道原因了,在空文件中,要先写一个东西,再memcpy 不然还是一样core dump.
Program received signal SIGBUS, Bus error. 0x000000000040237e in memcpy (__len=4096, __src=0x7ffff7ff7000, __dest=0x7ffff7ff6000) at /usr/include/x86_64-linux-gnu/bits/string3.h:53 53 return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); (gdb) Program terminated with signal SIGBUS, Bus error. The program no longer exists.