我有一个多线程的代码,在某些情况下挂起。我想知道什么是推荐的调试方式?如何调试挂起的代码
回答
当它挂起时,您可以附加调试器并检查线程状态(包括调用堆栈)到您的心脏内容。通常会有一个(或多个)线程处于等待状态,您可能会弄清楚原因。
如果在挂起时状态不是不言自明,那么您可以使用建议的技术来为前面的程序流提供上下文信息。
因为它是多线程的,所以不能进行调试,比如设置断点,跟踪语句并暂停查看变量的值。我认为唯一的方法是打印到控制台并从那里查看状态。
它是否经常挂起(即你不需要等待几小时/天的挂起)?如果它很少挂起 - 抓取完整转储(即使用任务管理器)稍后用WinDbg进行调试。 如果它足够挂起 - Visual Studio更容易使用 - 只需附加(调试 - >附加到进程)以按照前面的建议挂起进程(除非使用Express版本 - “附加”不是它的一部分)
VS中最有用的视图是Debug - > Window - > Threads在一个窗口中,Debug - > Call Stack在另一个窗口中。跳过所有线程,看看是否有线程正在等待某些公共对象。
有很多关于如何使用WinDbg调试挂起的信息 - 搜索“windbg sos hang”以查找详细信息。即http://blogs.msdn.com/b/tess/archive/2009/10/19/net-hang-case-study-the-danger-of-locking-on-strings.aspx
退房波多黎各马里亚尼的博客 - http://blogs.msdn.com/b/ricom/archive/2010/06/04/debugging-multi-threaded-applications-some-tidbits.aspx
在跟踪:这是非常有用的,但要小心不要用跟踪代码引入更多的锁定问题。即控制台输出调用速度较慢并且序列化,因此您的挂起可能会消失。
- 1. Netbeans:C代码调试开始挂起
- 2. 如何调试挂起的Java线程?
- 3. 如何调试arm9 2.4.19 linux挂起?
- 4. 如何调试SSL https挂起ERR_CONNECTION_TIMED_OUT
- 5. 如何在挂起时调试`rails s`?
- 6. 挂起的进程,调试
- 7. 如何防止挂起此Java代码
- 8. 尝试获取响应代码时代码会挂起
- 9. 调试内核挂起
- 10. Chrome调试器挂起
- 11. 调试Javascript挂起系统
- 12. VS2008调试器挂起
- 13. Windows键盘挂钩挂起调试器
- 14. Eclipse在挂接调试器时挂起
- 15. Objective-C代码挂起
- 16. 串联代码挂起
- 17. 如何使用Flash Builder 4调试Flex 4中的挂起/挂起web服务?
- 18. 如何调试openGL代码?
- 19. 如何调试typelevel代码?
- 20. 如何调试nativescript代码?
- 21. 如何调试Haskell代码?
- 22. 如何调试AngularJS代码?
- 23. 如何调试Rexx代码?
- 24. 如何调试Erlang代码?
- 25. 如何调试代码Linqpad
- 26. 如何调试ruby代码?
- 27. 如何调试要测试的代码
- 28. 如何调试转码的JavaScript代码?
- 29. Emacs:如何调试挂钩?
- 30. 如何调试react-scripts挂?
如果你不给我们一个你在做什么的想法,我们不能帮你 – 2010-11-30 01:09:31
一个真正的质量questionn,但它是我最爱的标题:D – 2010-11-30 01:14:22