ret = client->trans->cleanup(client->trans); windows下一直block住无法结束,慢慢的单步执行可以过去。
uiopwang opened this issue · 11 comments
uiopwang commented
使用的这个版本
commit 63e4ffd
Author: Xpol Wan xpolife@gmail.com
Date: Fri Apr 29 10:36:55 2016 +0800
pc_trans: split sync and async code in pc_tranc.c into different functions.
环境VS2015社区版,集成到cocos2dx中遇到这个问题。
/*
* when cleaning transport up, transport should ack all
* the request it holds from client so that client can release them
*
* transport->cleanup may be blocking.
*/
ret = client->trans->cleanup(client->trans);
if (ret != PC_RC_OK) {
pc_lib_log(PC_LOG_ERROR, "pc_client_cleanup - transport cleanup error: %s", pc_client_rc_str(ret));
return ret;
}
cynron commented
阻塞的时候,break一下,抓一下堆栈,然后把堆栈贴一下
uiopwang commented
主线程在这块
int uv_thread_join(uv_thread_t *tid) {
if (WaitForSingleObject(*tid, INFINITE))
return uv_translate_sys_error(GetLastError());
else {
CloseHandle(*tid);
*tid = 0;
return 0;
}
}
uiopwang commented
cynron commented
这个时候,是可以break掉的,break掉以后,是可以看到其他线程的堆栈的
只看主线程堆栈没意义
主要是想看一下libuv的线程在干啥
uiopwang commented
cynron commented
你一个一个点开看,堆栈里面有uv字样的就是了,最顶的堆栈应该是uv_run
uiopwang commented
cynron commented
- 从你提供出来的信息看,问题可以表述为 当cleanup的时候,主线程调用uv_thread_join, 等待uv线程结束,然后uv线程一直没有退出,造成的问题
- 单单一个截图只能说明uv线程堵在 uv_poll_ex上,但是不排除此时uv线程还在正常运行,你可以不停地continue,break,看看这个线程的堆栈是不是有变化,如果一直没有变化的话,才可以确定是不是一定卡在uv_poll_ex上,看看uv线程是不是很无法从uv_poll_ex上返回,还是返回后又进来了。现在你有代码,是很容易调试的。可以在uv_poll_ex上打断点,也可以在uv_run上打断点
- 通过上面的调试,可以确定是不是uv本身的问题,还是uv在windows上的问题等等.....,这个需要你自己确认
- 我自己本身没有windows开发环境,也没太多时间去跟踪,对windows的底层也不熟悉,没法提供更多帮助
cynron commented
建议:
- 如果没有特殊的必要的话,pc_client_cleanup是没有必要调用的,在绝大部分情况下都是没必要调用的,因为如果仅仅想断开连接的话,直接disconnect就好了,要再重连,就再connect就好了
- 如果是退出前清理的话,因为已经准备退出了,实际上这个清理不清理都没关系,清理的意义也没那么大
uiopwang commented
谢谢指点,我抽时间试下吧。