提问者:小点点

munmap中的程序崩溃


我在一个Android应用程序中工作,它必须将后台数据发送到ftp服务器。 执行此操作的代码是用本机代码编写的,使用的是标准的Linux函数。

大多数时候它工作得很好,但每隔一段时间它就会崩溃,而崩溃让我发疯,因为它对我来说毫无意义。

下面是相关代码:


 if(!sbuf.st_size)
 {
     syslog(LOG_CRIT, "FTP: OMFG WE GOT 0 FILE SIZE!!!11!!!! ");
     close(fd);
     fclose(stream);
     close(dsock);
     return 0;
 }

 p = mmap(0, (size_t) sbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);

 if(p==MAP_FAILED)
 {
     syslog(LOG_CRIT, "FTP: We got a mmap problem.... %s",strerror(errno));
     close(fd);
     fclose(stream);
     close(dsock);
     return 0;
 }

 syslog(LOG_CRIT, "Before fwrite");

 if(fwrite(p, 1, (size_t) sbuf.st_size, stream)!=(size_t) sbuf.st_size)
 {
     syslog(LOG_CRIT, "FTP: We got a fwrite problem.... %s",strerror(errno));
     munmap(p, (size_t) sbuf.st_size);
     close(fd);
     fclose(stream);
     close(dsock);
     return 0;
 }

 fflush(stream);
 usleep(150000);
 syslog(LOG_CRIT, "Before munmap");

 munmap(p, (size_t) sbuf.st_size);
 //fflush(stream);
 close(fd);
 fclose(stream);
 close(dsock);

logcat中的相关内容如下:

07-13 21:30:50.557 10268-10376/? E/com.example.ftp_cam: Before munmap
07-13 21:30:50.561 10268-15934/? E/IMemory: cannot dup fd=69, size=4096, err=0 (Bad file descriptor)
07-13 21:30:50.561 10268-15934/? E/IMemory: cannot map BpMemoryHeap (binder=0x7f57d239a0), size=4096, fd=-1 (Bad file descriptor)
07-13 21:30:50.561 10268-15934/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 15934 (Binder:10268_6)
07-13 21:30:50.570 10268-10376/? E/com.example.ftp_cam: FTP: Uploading of file IMG_20200713_082444.jpg should be completed.

所以似乎代码在munmap中崩溃了。 但是,代码在segfault之后继续一段时间,因为它显示了文件上传完成消息(在代码的更下面)。

知道问题出在哪里吗? 谢谢你的时间!


共1个答案

匿名用户

您正在用PROT_READ映射fd并尝试写入它。 写入将扼杀您的应用程序。 另外,为了写入不使用fwrite()等函数的地址,您可以简单地将address设置为某个对象,或者使用memset,strcpy等。