作者windows2k (程式宅 <囧>)
看板AndroidDev
标题[问题] 如何定位NDK Block issue
时间Sat Oct 20 11:29:10 2018
这问题有点难描述...不是Crash, 所以不能用ndk-stack下去看
而是Native code的程式码被Blocked住了
同样的程式码, 在Android 6之前都运行正常, 在Android 7之後就出现了
由於是Linux based, Linux 我试不出来此Bug
程式码逻辑大概是这样
开一个 listen socket -> 设成 NonBlocking Mode
epoll -> 得到一个 Read Event -> Accept new socket
程式码来自於知名Network Library, 我想错误的机率不大
经过夹击之後, 我发现问题可能出在 Accept new socket这部分
Accept前後程式码没有System call, 并且没有Blocking的可能
根据 Linux Manual 上所写
If no pending connections are present on the queue, and the socket is not
marked as nonblocking, accept() blocks the caller until a connection is
present. If the socket is marked nonblocking and no pending connections are
present on the queue, accept() fails with the error EAGAIN or EWOULDBLOCK.
理论上根本不会有问题...
於是作了以下尝试
1. 在Accept之前再次将 Socket 设成 non-blocking => 没用
2. 在Accept前後加上 __android_log_print 做夹击 => 做不出来, 但不是我想要的解法
我的问题主要有两个
1. 如何证明 accept 会卡住
2. 如何避开这个问题
卡关了很久, 希望有人给我一点想法吧, 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.32.87.63
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1540006153.A.A89.html
※ windows2k:转录至看板 LinuxDev 10/20 12:06
1F:推 uorol: 你的问题是accept()之後要再accept()新的socket时卡住? 10/20 12:56
2F:→ windows2k: 是epoll_wait丢出一个pollin event, 然後accept卡住 10/20 14:52
3F:→ windows2k: 不过这是只有在程式运行途中wifi关掉的情况下做出 10/20 14:53
4F:→ windows2k: kernel中accept那段程式码跟wifi没关系就是了 10/20 14:53