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

作者: windows2k (程式宅 <囧>)   2018-10-21 09:00:00
※ 引述《windows2k (程式宅 <囧>)》之銘言:
: 推 yvb: 是否有可以 reproduce 的 sample code ? 10/20 22:02
程式碼在 Libuv中
我只列出我需要的程式碼
在 src/unix/linux-core中的
void uv__io_poll(uv_loop_t* loop, int timeout) {
nfds = epoll_pwait(loop->backend_fd,
events,
ARRAY_SIZE(events),
timeout,
psigset);
if (pe->events != 0) {
w->cb(loop, w, pe->events); // 這邊已經確定 epoll_wait吐出 POLLIN
}
}
然後callback長這個樣子
src/unix/stream.c
void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) {
while (uv__stream_fd(stream) != -1) {
err = uv__accept(uv__stream_fd(stream));
// 我在底下加Log, 結果沒印出來, 所以懷疑是在uv_accept的地方出錯
}
}
uv__accept的實作在
src/unix/core.c
int uv__accept(int sockfd) {
int peerfd;
int err;
while (1) {
static int no_accept4;
if (no_accept4)
goto skip;
peerfd = uv__accept4(sockfd,
NULL,
NULL,
UV__SOCK_NONBLOCK|UV__SOCK_CLOEXEC);
skip:
peerfd = accept(sockfd, NULL, NULL);
// 不管是 accept4或是accpt都會block住
}
: → yvb: 以及是否使用 strace 追踪 syscall 的情況了呢? 10/20 22:03
Android應該不能用strace吧..
不過有一點很奇怪, 我是在執行到一半的時候Wifi關閉, 然後就做出來了
不過看了一下Linux Kernel的Code...應該不會影響才是
作者: yvb   2018-10-23 19:03:00
請 google: android strace另外, kill -3 pid 或 kill -11 pid, 也許就能用 ndk-stack ?

Links booklink

Contact Us: admin [ a t ] ucptt.com