Fw: [問題] 如何定位NDK Block issue

作者: windows2k (程式宅 <囧>)   2018-10-20 12:06:59
※ [本文轉錄自 AndroidDev 看板 #1Rog49g9 ]
作者: 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. 如何避開這個問題
卡關了很久, 希望有人給我一點想法吧, 謝謝
作者: yvb   2018-10-20 22:02:00
是否有可以 reproduce 的 sample code ?以及是否使用 strace 追踪 syscall 的情況了呢?

Links booklink

Contact Us: admin [ a t ] ucptt.com