今天在修改安全登录的代码,实现socket和服务器1、版本交互、2、鉴权信息交互。写完调试时,第一步版本交互成功,但是在第二步发完鉴权消息后(从服务器侧看到我发的消息),在socket recv时出现android死机的问题,错误的log如下:
05-15 12:25:04.830: I/ActivityManager(370): Process com.xxx.xxx (pid 3805) has died.
05-15 12:25:04.830: I/WindowState(370): WIN DEATH: Window{420154d0 u0 SurfaceView}
05-15 12:25:04.830: I/qtaguid(370): Failed write_ctrl(s 0 10060) res=-1 errno=1
05-15 12:25:04.830: W/InputDispatcher(370): channel '41fb9d20 com.xxx.xxx/com.xxx.xxx.xxx(server)' ~ Consumer closed input channel or an error occurred. events=0x9
05-15 12:25:04.830: W/NetworkManagementSocketTagger(370): setKernelCountSet(10060, 0) failed with errno -1
05-15 12:25:04.830: E/InputDispatcher(370): channel '41fb9d20 com.xxx.xxx/com.xxx.xxx.xxx(server)' ~ Channel is unrecoverably broken and will be disposed!
05-15 12:25:04.830: W/InputDispatcher(370): channel '4208b880 Connecting... (server)' ~ Consumer closed input channel or an error occurred. events=0x9
05-15 12:25:04.830: E/InputDispatcher(370): channel '4208b880 Connecting... (server)' ~ Channel is unrecoverably broken and will be disposed!
或者下面的错误
I/WindowState( 370): WIN DEATH: Window{41f85bb0 u0 com.xxx.xxx/com.xxx.xxx.CanvasActivity}
W/WindowManager( 370): Force-removing child win Window{41f9a458 u0 SurfaceView} from container Window{41f85bb0 u0 com.xxx.xxx/com.xxx.xxx.xxx}
I/ActivityManager( 370): Process com.xxx.xxx(pid 4051) has died.
I/qtaguid ( 370): Failed write_ctrl(s 0 10060) res=-1 errno=1
W/NetworkManagementSocketTagger( 370): setKernelCountSet(10060, 0) failed with errno -1
W/InputDispatcher( 370): channel '41ea2e88 com.xxx.xxx/com.xxx.xxx.xxx(server)' ~ Consumer closed input channel or an error occurred. events=0x9
E/InputDispatcher( 370): channel '41ea2e88 com.xxx.xxx/com.xxx.xxx.xxx(server)' ~ Channel is unrecoverably broken and will be disposed!
对于修改的socket通信进行了额外的检查,没发现什么问题,网上查查,众说纷纭啊,但是我觉得有一个人提到,和写入非法数据相关,我感觉也是这个问题,并打印一些log,跟踪程序是死在哪儿,结果发现我加打印后死的位置变化了,这让我很疑惑,而且打出了如下的打印(错误log没保留,这儿示例一下)
05-15 12:25:04.830: [ 05-15 12:25:04.755:......
05-15 12:25:04.830: ]test1 /*test是我想输出的*/
突然想到打印log有问题,因为之前可能随手一改,把打印消息的参数从2变成了1个,导致错误,改了OK
__android_log_print(6,"ssl_client","auth err, auth_result = %d\n", info->auth_result);
写成了__android_log_print(6,"ssl_client auth err, auth_result = %d\n", info->auth_result);
这样导致了错误,居然编译无错误啊,坑人啊。
总结,因为时间比较急,改代码也是急了些,并且用了好多拷贝,对于打印信息没特别关注,导致问题,要注意,不过这次也是对于win death有了一点点了解,不怎么害怕了。Win death多可能是因为出现非法读写和访问,指针空操作访问什么,还有程序参数不匹配,(有些猜测的成分)以后遇到再补充
在开发中遇到Android应用在socket通信时出现Win Death问题,导致进程死亡。通过日志分析,发现可能是由于打印log时参数错误,导致非法读写。修复后问题解决,提醒开发者注意代码细节,避免类似错误。

748

被折叠的 条评论
为什么被折叠?



