[問題] 如何定位NDK Block issue

看板AndroidDev作者 (程式宅 <囧>)時間6年前 (2018/10/20 11:29), 編輯推噓1(103)
留言4則, 2人參與, 6年前最新討論串1/1
這問題有點難描述...不是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://www.ptt.cc/bbs/AndroidDev/M.1540006153.A.A89.htmlwindows2k:轉錄至看板 LinuxDev 10/20 12:06

10/20 12:56, 6年前 , 1F
你的問題是accept()之後要再accept()新的socket時卡住?
10/20 12:56, 1F

10/20 14:52, 6年前 , 2F
是epoll_wait丟出一個pollin event, 然後accept卡住
10/20 14:52, 2F

10/20 14:53, 6年前 , 3F
不過這是只有在程式運行途中wifi關掉的情況下做出
10/20 14:53, 3F

10/20 14:53, 6年前 , 4F
kernel中accept那段程式碼跟wifi沒關係就是了
10/20 14:53, 4F
文章代碼(AID): #1Rog49g9 (AndroidDev)
文章代碼(AID): #1Rog49g9 (AndroidDev)