Сбой программы в munmap - PullRequest
       67

Сбой программы в munmap

0 голосов
/ 13 июля 2020

Я работаю над приложением Android, которое, помимо прочего, должно отправлять фоновые данные на ftp-сервер. Код, который делает это, написан в машинном коде с использованием стандартных функций Linux.

В большинстве случаев он работает нормально, но время от времени он дает сбой, и cra sh сводит меня с ума , потому что для меня это не имеет смысла.

Вот соответствующий код:


 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 вылетает. Однако код продолжается еще немного после segfault, потому что он показывает сообщение о завершении загрузки файла (которое находится ниже по коду).

Есть идеи, в чем может быть проблема? Спасибо за уделенное время!

Ответы [ 2 ]

3 голосов
/ 13 июля 2020

Таким образом, кажется, что код в munmap вылетает.

Если я правильно понимаю файл журнала, это не так:

Ваша программа кажется многопользовательской -threaded (в случае файла журнала: потоки 10376 и 15934).

Вы вызываете munmap() из потока 10376, но ваша программа дает сбой в потоке 15934.

Итак, проблема в в другом потоке. Возможно, это вообще не имеет отношения к munmap().

Однако, возможно, это связано с munmap(): Может быть, другой поток обращается к отображаемой памяти ...

0 голосов
/ 13 июля 2020

Вы сопоставляете fd с PROT_READ и пытаетесь писать в него. Запись убьет ваше приложение. Кроме того, чтобы писать по адресам, которые вы не используете такие функции, как fwrite (), вы можете просто установить адрес для чего-то или использовать memset, strcpy et c.

...