android - 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 中崩溃了。但是,代码在段错误之后会继续运行一段时间,因为它显示文件上传完成消息(位于代码的更下方)。
知道可能是什么问题吗?谢谢你的时间!
解决方案
所以似乎代码在 munmap 中崩溃了。
如果我正确理解日志文件,情况并非如此:
您的程序似乎是多线程的(在日志文件的情况下:线程 10376 和 15934)。
您munmap()
从线程 10376 调用,但您的程序在线程 15934 中崩溃。
所以问题出在另一个线程上。也许它根本与 无关munmap()
。
但是,它可能与munmap()
:也许其他线程访问映射的内存...
推荐阅读
- java - 由 keycloak 的 java 适配器创建的连接上的“keep-alive”标头
- c - Xv6中P2V、V2P宏背后的机制是什么
- java - Hive JDBC 连接设置或与 MySQL 的映射
- go - golang 的手册页?
- javascript - 如何确定用户是否在 Javascript 中附加了键盘
- java - 使用 TomEE 嵌入式和 Microprofile 容错进行集成测试
- javafx - JavaFX按钮背景向右溢出1px
- php - Sql CURDATE() 下个月不工作
- ios - 从 DynamoDB 中的表中获取信息
- r - 创建表达式测试以查看 R 中的 `as.formula('X ~ 1')` 是否包含截距?