memcpy core dump bus error
size:15383
make: *** [run] Bus error (core dumped)
请教关于总线错误(Bus error) 和 定位处理问
多线程Mmap文件Bus Error及解决的办法
算了,先放弃了。
: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.
版权声明:本文为hunter___原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。