我在windows下开发了一个网络dll,类似驱动的方式, 应用程序启动会加载。现在的问题是,某些应用程序加载后,cpu会占用到100%, 我用windbg调试,发现cpu主要消耗在 ::select 这个地方。 但根据我的dll的日志,select是成功了的, 所以怀疑是应用程序的消息机制出了问题(select检测到成功事件后,发消息给其它线程失败)。消息机制的问题,我推测可能是dll不健壮,导致应用程序的消息线程异常退出了,或者是其它线程异常退出,导致消息线程锁住了。现在的问题是,怎么能够最终定位到出现问题的地方呢?windbg我用的不熟,正在努力学习中, 期待高手们的指点!

解决方案 »

  1.   

    做log日志,你看看定位在哪里windbg这个没有用过的
      

  2.   

    不可能是锁住了,锁住的特征是cpu很少占用,你这种情况应该是程序始终在一个循环中跑
      

  3.   

    添加日志,打印出来看看,还可以用windbg的adiplus强行dump出进程数据来分析
      

  4.   

    1.日志或者调试信息输出可以解决 一些死锁,死循环抢占CPU的问题。2.try catch 结构化异常配合dump,可以解决异常问题。
      

  5.   

    写个log
    http://blog.csdn.net/fengbingchun/article/details/7035556
      

  6.   

    非常感谢楼上兄弟们的建议。我的这个dll是有日志的,现在根据日志分析,是 select这个线程一直在打印日志, 并且显示 其它线程的 connect事件已经触发(writable事件触发),但connect所在的线程没有任何后续的处理。所以我怀疑是connect所在的线程被锁住了,或者是其它某个转发消息的线程被锁住了。
      

  7.   

    将这个问题的结论备忘一下。我的实现类似驱动,会hook网络相关函数,有一个网络函数(cancelio)没有hook,导致应用程序调用这个接口后,我没有收到消息,应用程序一直循环中,不能终止。