bug:memcpy core dump bus error

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.

 

 


版权声明:本文为hunter___原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。