inu.cc 开发日志

最近几次更新,发现了项目中一点小问题,算是对 rails 框架理解不够深刻导致的吧。blog 下来,方便以后提醒自己。

check_box 方法会生成一个 type="checkbox" 的选择框。通常情况下,不选中这个框将不会提交相关的数据,controller 中取得该值为 nil,其实从逻辑上说,不选择表示 false ,而不是 nil 。因此,rails 选择的做法是添加一个同名的 type="hidden" 的隐藏表单,值为 0 。一般来说这种做法能够保证 controller 中取得的值只有 true 和 false 两种情况,但是,有一种情况例外:method="get" 。应该算是 rails 没有对这个方法实现完整,只针对 post 的情况额外处理了 checkbox 的这种特例(两个同名的 field 将会提交一个数组)。解决的办法只有在 controller 取值的时候用 ||= 操作符另外赋值,或者重写 request.params 方法以识别这种情况。

第二个问题是数据库表字段的默认值。对于“默认值”的概念经常会产生一种混淆:没有值就应该用默认值。其实不是这样的。如果一个字段允许 NULL ,默认值为 0  ,如果在 SQL 语句中显式声明插入一个 null 值,数据库是不会使用默认值的。只有在没有显示为该字段指明值的时候才会使用默认值,提供空值并不属于这种情况。

01-01 13:02:33.162 863 863 D Zygote : Forked child process 7448 01-01 13:02:33.162 1664 1820 I ActivityManager: Start proc 7448:com.google.android.partnersetup/u0a117 for broadcast {com.google.android.partnersetup/com.google.android.partnersetup.PhoneStateReceiver} 01-01 13:02:33.162 1664 1820 I ActivityManager: mPidMap put ProcessRecord{24812d1 7448:com.google.android.partnersetup/u0a117} 01-01 13:02:33.162 1664 1778 I ActivityManager: ProcessObserver broadcast disabled 01-01 13:02:33.162 1664 1820 D OStatsManager_OplusBatteryStatsEventManager: onProcessStarted : pid = 7448processUid = 10117packageUid = 10117packageName = com.google.android.partnersetupprocessName = com.google.android.partnersetup 01-01 13:02:33.163 1664 5354 I OStatsManager_OplusBatteryStatsManager: updateStateTime: PkgName = com.google.android.partnersetup, uid = 10117, state to bg, mForegroundCnt = 0, isFg = false 01-01 13:02:33.163 1664 5354 D OStatsManager_OplusBatteryStatsManager: noteProcessCreate [7448], uid = 10117, pkgName = com.google.android.partnersetup, pid = 7448, processName = com.google.android.partnersetup 01-01 13:02:33.165 7448 7448 E libprocessgroup: Failed to write '10117' to /dev/memcg/apps/uid_10117//memory.app_uid: Permission denied 01-01 13:02:33.165 7448 7448 F app_process: jni_internal.cc:826] JNI FatalError called: (com.google.android.partnersetup) frameworks/base/core/jni/com_android_internal_os_Zygote.cpp:2025: createProcessGroup(10117, 0) failed: Permission denied 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] Runtime aborting... 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] Dumping all threads without mutator lock held 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] All threads: 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] DALVIK THREADS (1): 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] "main" prio=5 tid=1 Runnable 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] | group="" sCount=0 ucsCount=0 flags=0 obj=0x751e8f88 self=0xb400007d5f8d0000 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] | sysTid=863 nice=0 cgrp=default sched=0/0 handle=0x7e13039098 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] | state=? schedstat=( 0 0 0 ) utm=0 stm=0 core=0 HZ=100 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] | stack=0x7fc901e000-0x7fc9020000 stackSize=8188KB 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] | held mutexes= "abort lock" "mutator lock"(shared held) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] native: (Unwind failed for thread 863: Thread Does Not Exist) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.Zygote.nativeSpecializeAppProcess(Native method) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.Zygote.specializeAppProcess(Zygote.java:538) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.Zygote.childMain(Zygote.java:1000) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.Zygote.forkSimpleApps(Zygote.java:854) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.ZygoteConnection.processCommand(ZygoteConnection.java:294) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.ZygoteServer.runSelectLoop(ZygoteServer.java:575) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1061) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] Aborting thread: 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] "main" prio=5 tid=1 Native 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] | group="" sCount=0 ucsCount=0 flags=0 obj=0x751e8f88 self=0xb400007d5f8d0000 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] | sysTid=863 nice=0 cgrp=default sched=0/0 handle=0x7e13039098 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] | state=? schedstat=( 0 0 0 ) utm=0 stm=0 core=0 HZ=100 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] | stack=0x7fc901e000-0x7fc9020000 stackSize=8188KB 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] | held mutexes= "abort lock" "mutator lock"(shared held) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] native: (Unwind failed for thread 863: Thread Does Not Exist) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.Zygote.nativeSpecializeAppProcess(Native method) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.Zygote.specializeAppProcess(Zygote.java:538) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.Zygote.childMain(Zygote.java:1000) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.Zygote.forkSimpleApps(Zygote.java:854) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.ZygoteConnection.processCommand(ZygoteConnection.java:294) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.ZygoteServer.runSelectLoop(ZygoteServer.java:575) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1061) 01-01 13:02:33.177 7448 7448 F app_process: runtime.cc:709] 01-01 13:02:33.178 7448 7448 F libc : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 7448 (main), pid 7448 (main) 01-01 13:02:33.186 7450 7450 E libc : capset failed: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 0: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 1: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 2: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 3: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 4: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 5: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 6: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 7: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 8: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 9: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 10: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 11: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 12: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 13: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 14: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 15: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 16: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 17: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 18: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 19: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 20: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 21: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 22: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 23: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 24: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 25: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 26: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 27: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 28: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 29: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 30: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 31: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 32: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 33: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 34: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 35: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 36: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 37: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 38: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 39: Operation not permitted 01-01 13:02:33.186 7450 7450 E libc : failed to raise ambient capability 40: Operation not permitted 01-01 13:02:33.200 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/0: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/1: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/2: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/3: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/4: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/5: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/7: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/8: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/9: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/10: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/11: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/12: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/13: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/14: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/15: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/16: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/17: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/18: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/19: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/20: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/21: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/22: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/23: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/24: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/25: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/26: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/27: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/28: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/29: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/30: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/31: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/32: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/33: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/34: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/35: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/36: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/37: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/38: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/39: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/40: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/41: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/42: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/43: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/44: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/45: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/46: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/47: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/48: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/49: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/50: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/51: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/52: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/53: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/54: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/55: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/56: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/57: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/58: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/59: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/60: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/61: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/62: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/63: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/64: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/65: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/66: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/67: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/68: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/69: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/70: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/71: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/72: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/73: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/74: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/75: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/76: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/77: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/78: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/79: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/80: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/81: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/82: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/83: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/84: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/85: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/86: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/87: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/88: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/89: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/90: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/91: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/92: Permission denied 01-01 13:02:33.201 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/93: Permission denied 01-01 13:02:33.202 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/94: Permission denied 01-01 13:02:33.202 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/95: Permission denied 01-01 13:02:33.202 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/96: Permission denied 01-01 13:02:33.202 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/97: Permission denied 01-01 13:02:33.202 7451 7451 E DEBUG : failed to readlink /proc/7448/fd/98: Permission denied 01-01 13:02:33.202 7451 7451 F crash_dump64: crash_dump.cpp:671] failed to attach to thread 7448: Operation not permitted 01-01 13:02:33.202 702 702 I tombstoned: received crash request for pid 7448 01-01 13:02:33.202 702 702 E tombstoned: unexpected dump type: kDebuggerdAnyIntercept 01-01 13:02:33.202 702 702 E tombstoned: failed to get crash output for type kDebuggerdAnyIntercept 01-01 13:02:33.203 7451 7451 E libc : failed to read response to DumpRequest packet: No message of desired type 01-01 13:02:33.203 7451 7451 E crash_dump64: failed to connected to tombstoned to report failure 01-01 13:02:33.204 7448 7448 F libc : Crash due to signal: crash_dump helper failed to exec, or was killed 01-01 13:02:33.212 863 863 I Zygote : Process 7448 exited due to signal 6 (Aborted)
07-19
<think>首先,用户的问题是基于Android系统日志中的错误信息,特别是与进程创建和权限相关的崩溃问题。用户说:"Android系统日志显示进程创建时出现权限错误,导致FatalError和崩溃,如何解决"。我需要根据提供的引用和系统指令来回答。 系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 参考站内引用:引用了三个来源:[^1]、[^2]、[^3]。 引用内容: - [^1]: 介绍了Android日志等级(Verbose, Debug, Info, Warning, Error, Fatal, Silent)。 - [^2]: 关于Android Init进程启动流程源码解析。 - [^3]: 关于Android日志系统分析,包括logd和logcat指令说明。 用户的问题是关于进程创建时权限错误导致FatalError和崩溃。我需要结合这些引用来构建回答。 关键点: - 错误级别:FatalError对应于日志等级F(Fatal),优先级7。 - 进程创建:可能与Init进程相关,因为引用[^2]提到了Init进程启动流程。 - 权限错误:可能是SELinux或文件权限问题,引用[^3]提到了selinux日志。 解决步骤: 1. **识别错误来源**:使用logcat查看日志,过滤错误级别。 2. **分析错误信息**:查找具体权限错误,如SELinux拒绝或文件权限不足。 3. **检查相关配置**:如init.rc文件(引用[^2])或SELinux策略。 4. **修复和测试**:修改权限或策略,并重新测试。 回答结构: - 逐步引导用户解决问题。 - 清晰、可靠。 - 使用中文。 生成相关问题:在回答末尾添加相关问题,类似于示例。 LaTeX要求:用户的问题中没有数学表达式,但如果有需要,我会使用$...$或$$...$$。但在这个上下文中,可能不需要数学公式,除非涉及计算。所以,我可能不需要添加数学表达式。 现在,构建回答大纲: 1. **理解问题**:解释日志中的FatalError。 2. **诊断步骤**: - 使用logcat命令查看日志。 - 过滤特定错误级别(如E或F)。 - 查找权限相关错误。 3. **常见原因**: - SELinux拒绝(avc: denied)。 - 文件或目录权限不足。 - Init脚本错误(init.rc)。 4. **解决方案**: - 调整SELinux策略。 - 修改文件权限。 - 检查init.rc配置。 5. **预防措施**:确保正确配置权限。 6. **生成相关问题**。 引用标识: - 在相关部分末尾添加[^1]、[^2]、[^3]。 - [^1] 用于日志等级。 - [^2] 用于Init进程启动。 - [^3] 用于日志系统和SELinux。 最终回答: - 以中文书写。 - 结构清晰。</think>### Android系统日志中进程创建权限错误导致FatalError的解决方案 当Android系统日志显示进程创建时出现权限错误,导致FatalError(致命错误)和系统崩溃时,这通常是由于权限不足或配置错误引起的。FatalError属于Android日志的最高优先级级别(F等级),表示严重问题需要立即处理[^1]。这类错误可能涉及进程启动流程(如Init进程)、文件权限或SELinux策略限制。以下我将逐步引导您诊断和解决问题,确保回答基于可靠参考和实际经验。 #### 步骤1: 识别日志中的权限错误 首先,使用`logcat`命令查看系统日志,并过滤出错误信息。FatalError通常伴随权限拒绝(Permission Denied)或SELinux拒绝(avc: denied)消息。 - **操作命令**: ```bash adb logcat -b all -s *:E *:F # 过滤Error和Fatal级别日志[^1] ``` - **关键点**: - 查找类似`FATAL EXCEPTION`或`Permission Denial`的条目。 - 例如,如果日志显示`init: Failed to create process for service: Permission denied`,这表示进程创建时权限不足[^2]。 - 引用[^1]指出,Android日志等级中F级别(Fatal)表示无法恢复的错误,优先级最高。 #### 步骤2: 分析错误原因 权限错误通常源于以下方面: - **SELinux策略拒绝**:Android的SELinux机制可能阻止进程访问所需资源。日志中常见`avc: denied`消息,表示安全策略阻止操作[^3]。 - **文件或目录权限不足**:进程启动脚本(如`init.rc`)可能访问了无权限的文件或设备节点。 - **Init进程配置错误**:Init进程是系统启动的第一个进程,负责解析`init.rc`文件并创建其他进程。如果脚本中定义的服务或命令权限设置不当,会导致崩溃[^2]。 - **其他常见原因**:应用UID/GID不匹配、SELinux上下文错误或内核模块问题。 #### 步骤3: 解决方案 根据错误原因,采取针对性修复措施。以下方法按优先级排序: 1. **调整SELinux策略**(最常见): - 如果日志包含`avc: denied`,修改SELinux策略文件。 - **操作步骤**: - 提取当前策略:`adb pull /sys/fs/selinux/policy`。 - 使用`audit2allow`工具生成新规则(需安装Android NDK或SELinux工具链): ```bash adb logcat -d | audit2allow -p policy # 生成缺失策略规则 ``` - 将生成的规则添加到设备策略文件(如`/vendor/etc/selinux/`下的`*.te`文件),然后重启设备。 - **预防**:在开发阶段,可临时禁用SELinux进行测试:`adb shell setenforce 0`(但生产环境不推荐)[^3]。 2. **修复文件权限**: - 检查日志中提到的文件或目录权限。 - **操作步骤**: - 使用`adb shell ls -l <文件路径>`查看权限。 - 修改权限:`adb shell chmod 755 <文件路径>`(确保所有者正确)。 - 如果问题在`init.rc`脚本中,编辑文件(位置:`/system/core/rootdir/init.rc`): ```bash adb pull /init.rc # 备份原文件 修改服务定义,例如添加:service myservice /system/bin/mybinary user root # 指定用户 group root # 指定组 adb push init.rc / # 推送修改后文件 adb reboot # 重启生效 ``` - 引用[^2]强调,Init进程启动流程中`init.rc`的配置错误是常见崩溃源。 3. **检查Init进程和启动脚本**: - 确保`init.rc`中服务定义正确。引用[^2]指出,Init进程源码(`system/core/init/main.cpp`)在解析脚本时可能因权限错误触发Fatal。 - **操作步骤**: - 使用`adb shell dmesg`查看内核日志,确认启动阶段错误。 - 验证服务是否在正确上下文中运行(如`seclabel`属性)。 4. **高级调试**: - 如果错误持续,启用详细日志: ```bash adb shell setprop persist.log.tag VERBOSE # 设置日志级别为Verbose[^1] adb logcat -v threadtime # 捕获更多细节 ``` - 分析`logd`守护进程:引用[^3]提到,`logd`负责日志管理,检查其状态:`adb shell logd -v`。 #### 步骤4: 测试和验证 - 应用修复后,重启设备:`adb reboot`。 - 重新运行触发崩溃的场景,并使用`logcat`确认错误是否消失。 - 如果问题解决,但需长期稳定,建议: - 在设备上固化SELinux策略更新。 - 使用Android测试工具(如CTS)验证系统稳定性。 #### 预防措施 - **开发阶段**:在代码中提前检查权限(如`checkPermission()`方法)。 - **日志监控**:定期使用自动化工具(如Android Studio的Logcat)监控日志。 - **参考最佳实践**:Android文档建议在`init.rc`中最小化权限分配,避免使用`root`用户除非必要[^2]。 通过以上步骤,大多数权限错误导致的FatalError可被解决。如果问题复杂或涉及内核,建议结合引用[^3]的日志系统分析深入排查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值