首页 > 解决方案 > 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);

 int tries=0;

 while(1) {

     if(tries>3)return 0;

     len = ftpTryRead(csock, buffer, 128);
     if (len <= 0) {
         syslog(LOG_CRIT, "FTP: Got null after upload, len is %i",len);
         //return 0;
         usleep(300000);
         tries++;
         continue;
     }

     if(!strncmp(buffer,"226",3))break;
     else
     {
         syslog(LOG_CRIT, "FTP: Expected 226 but got %s",buffer);
         return 0;
     }
 }
 //sleep(2);

 syslog(LOG_CRIT, "FTP: Uploading of file %s should be completed.",file);
 unlink(file_name);
 
 return 1;

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 中崩溃了。但是,代码在段错误之后会继续运行一段时间,因为它显示文件上传完成消息(位于代码的更下方)。

知道可能是什么问题吗?谢谢你的时间!

标签: androidlinuxmmap

解决方案


所以似乎代码在 munmap 中崩溃了。

如果我正确理解日志文件,情况并非如此:

您的程序似乎是多线程的(在日志文件的情况下:线程 10376 和 15934)。

munmap()从线程 10376 调用,但您的程序在线程 15934 中崩溃。

所以问题出在另一个线程上。也许它根本与 无关munmap()

但是,它可能与munmap():也许其他线程访问映射的内存...


推荐阅读