NetEase/libpomelo2

ret = client->trans->cleanup(client->trans); windows下一直block住无法结束,慢慢的单步执行可以过去。

uiopwang opened this issue · 11 comments

使用的这个版本
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;
}

阻塞的时候,break一下,抓一下堆栈,然后把堆栈贴一下

停在一个系统的dll,每次都是这样。更详细的堆栈信息不知道怎么获取了。 @cynron

主线程在这块

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;
  }
}

这个时候,是可以break掉的,break掉以后,是可以看到其他线程的堆栈的

只看主线程堆栈没意义

主要是想看一下libuv的线程在干啥

uv_thread_join这个是libuv的函数么?libuv没用过。我不知道哪个是libuv的线程。我贴了张图,你告诉我下。
stack

你一个一个点开看,堆栈里面有uv字样的就是了,最顶的堆栈应该是uv_run

只有这一个有堆栈信息。有需要的话代码可以发给你们。
rpc

@uiopwang

  1. 从你提供出来的信息看,问题可以表述为 当cleanup的时候,主线程调用uv_thread_join, 等待uv线程结束,然后uv线程一直没有退出,造成的问题
  2. 单单一个截图只能说明uv线程堵在 uv_poll_ex上,但是不排除此时uv线程还在正常运行,你可以不停地continue,break,看看这个线程的堆栈是不是有变化,如果一直没有变化的话,才可以确定是不是一定卡在uv_poll_ex上,看看uv线程是不是很无法从uv_poll_ex上返回,还是返回后又进来了。现在你有代码,是很容易调试的。可以在uv_poll_ex上打断点,也可以在uv_run上打断点
  3. 通过上面的调试,可以确定是不是uv本身的问题,还是uv在windows上的问题等等.....,这个需要你自己确认
  4. 我自己本身没有windows开发环境,也没太多时间去跟踪,对windows的底层也不熟悉,没法提供更多帮助

建议:

  1. 如果没有特殊的必要的话,pc_client_cleanup是没有必要调用的,在绝大部分情况下都是没必要调用的,因为如果仅仅想断开连接的话,直接disconnect就好了,要再重连,就再connect就好了
  2. 如果是退出前清理的话,因为已经准备退出了,实际上这个清理不清理都没关系,清理的意义也没那么大

谢谢指点,我抽时间试下吧。