问题:
在打开camera过程中执行调用log_monitor_thread_init过程中创建log_monitor_thread_proc出现问题导致crash.
C3AC38A 07-03 08:34:36.482 8924 8924 F DEBUG : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
C3AC38B 07-03 08:34:36.482 8924 8924 F DEBUG : Abort message: 'invalid pthread_t 0xe503e1c0 passed to pthread_setname_np'
C3AC3A5 07-03 08:34:36.512 8924 8924 F DEBUG : backtrace:
C3AC3A6 07-03 08:34:36.512 8924 8924 F DEBUG : #00 pc 00038300 /apex/com.android.runtime/lib/bionic/libc.so (abort+172) (BuildId: 29d129f5e3950af1f282b1036b38d770)
C3AC3A7 07-03 08:34:36.512 8924 8924 F DEBUG : #01 pc 000806cf /apex/com.android.runtime/lib/bionic/libc.so (__pthread_internal_find(long, char const*)+98) (BuildId: 29d129f5e3950af1f282b1036b38d770)
C3AC3A8 07-03 08:34:36.512 8924 8924 F DEBUG : #02 pc 0008065b /apex/com.android.runtime/lib/bionic/libc.so (__pthread_internal_gettid(long, char const*)+2) (BuildId: 29d129f5e3950af1f282b1036b38d770)
C3AC3A9 07-03 08:34:36.512 8924 8924 F DEBUG : #03 pc 00082321 /apex/com.android.runtime/lib/bionic/libc.so (pthread_setname_np+112) (BuildId: 29d129f5e3950af1f282b1036b38d770)
C3AC3AA 07-03 08:34:36.512 8924 8924 F DEBUG : #04 pc 0008ef8b /vendor/lib/hw/camera.xxxxx.so (sprdcamera::SprdCamera3OEMIf::log_monitor_thread_init(void*)+126) (BuildId: 8fa92e7c0bee051bf6d73f62c9e7b56d)
主要原因为:
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(&obj->mLogHandle, &attr,
log_monitor_thread_proc, (void *)obj);
pthread_setname_np(obj->mLogHandle, "logstatus");
pthread_attr_destory(&attr);
使用分离线程方式创建,这种线程运行很快,而mLogMonitor打印为0,while循环不执行,该log_monitor_thread_proc立即退出,后续pthread_setname_np就可能出现非法地址。
M3AC194 07-03 08:34:36.418 474 8918 I Cam3OEMIf: 10884, log_monitor_thread_proc: E, 0
源码: HAL_LOGI("E, %d",mLogMonitor.load());
while(mLogMonitor.load() > 1) {
......
}
>>signal非法地址
C3AC38A 07-03 08:34:36.482 8924 8924 F DEBUG : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
C3AC38B 07-03 08:34:36.482 8924 8924 F DEBUG : Abort message: 'invalid pthread_t 0xe503e1c0 passed to pthread_setname_np'
解决方法:
PTHREAD_CREATE_DETACHED 分离线程创建的线程处理函数log_monitor_thread_proc是不能立即结束的。
(1)可以把 pthread_setname_np(obj->mLogHandle, "logstatus"); 这行去掉;
(2)或者确定 log_monitor_thread_proc 不会立即退出;
(3)或者增加自旋锁;