You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 12中gettimeofday()返回ERRNO 75异常问题求助

问题分析与解决方案

核心原因

从strace输出能明确看到,内核返回的CLOCK_REALTIME时钟值完全异常:tv_sec达到了3416400658881740019,这个数值远超出用户态时间结构体的存储范围,直接触发EOVERFLOW错误(错误码75,对应提示"Value too large for defined data type")。同时循环调用中时间值恒定,说明系统实时时钟完全停止走时,大概率是以下两种情况:

  • 设备硬件RTC(实时时钟)模块故障,比如供电电池耗尽、硬件损坏,导致时钟锁死在错误的超大值;
  • Android 12内核的时钟驱动存在严重bug,导致实时时钟的数值计算溢出或异常。

解决步骤

1. 硬件与系统层面修复

  • 检查RTC供电:部分Android设备的RTC依赖独立纽扣电池供电,若电池耗尽会导致时钟异常。可尝试更换电池(设备支持的前提下)后重启测试。
  • 手动重置系统时间:通过ADB命令强制设置正确时间,命令示例:
    adb shell date -s "20240520.143000"
    
    设置完成后重新运行测试代码,观察时间是否恢复正常。
  • 系统恢复:若手动设置无效,尝试重启设备,或备份数据后恢复出厂设置,排除系统配置损坏的可能。

2. 代码层面兼容处理

如果无法修复系统/硬件问题,可通过代码规避:

  • 合法性校验:在使用时间值前添加范围校验,过滤明显异常的数值:
    struct timeval tv;
    int ret = gettimeofday(&tv, NULL);
    if (ret < 0) {
        printf("gettimeofday failed with %s\n", strerror(errno));
    } else {
        // 校验时间戳是否在合理范围(1970年到2100年之间)
        if (tv.tv_sec >= 0 && tv.tv_sec <= 4102444800) {
            printf("%lu.%ld\n", tv.tv_sec, tv.tv_usec);
        } else {
            printf("Invalid system time detected\n");
        }
    }
    
  • 改用启动时钟:如果业务不需要绝对时间,改用CLOCK_BOOTTIME时钟,该时钟从设备启动开始计时,不受系统时间异常影响,适合计算时间间隔:
    struct timespec ts;
    int ret = clock_gettime(CLOCK_BOOTTIME, &ts);
    if (ret == 0) {
        printf("%ld.%09ld\n", ts.tv_sec, ts.tv_nsec);
    } else {
        printf("clock_gettime failed: %s\n", strerror(errno));
    }
    

内容的提问来源于stack exchange,提问作者Atte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:24:40