作者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/m.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