携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情。
在适当的位置加入断点,运行一段多线程的程序,然后开始下面的多线程调试之旅吧~
1. 并行监视
点击调试-窗口-并行监视就可以显示当前程序有的线程
【说明】
- 其中黄色光标就是当前运行到的代码行所在的线程
- 可以在并行监视表格中的第四列上填写你想要监视的变量,这里我要监视一个字符串变量osgbfile,键入后回车即可得到每个线程上这个内容的值
- 这种方式,也可以查看当前没有运行到的线程上的变量的值,比如下图154236中的地址值
- 比较复杂的变量,在当前窗口可能无法全面看到里面的值,可以将鼠标悬停在对应的值的位置上,然后点击向右尖角号,展开变量就可以了;或者采用步骤3中的方法监控变量的值
- 如果此时有些线程这个值为空,可以考虑是否是对应的线程暂时还有没有运行到处理这个变量的位置,继续根据自己的需求F11(逐语句)或者F10(逐过程)的调试就可以了;或者考虑当前变量的作用域问题。
- 运行过程中,并行监视的面板上某些线程会消失,这可能是因为当前线程生命周期结束。
2. 监视变量
如果通过鼠标悬浮,所监视的变量显示不全,可以使用常规的监视操作来监视具体的变量(点击调试-窗口-监视,键入对应的变量名即可)
【说明】
- 点击上图标记出来的向右三角们可以展开变量,开到这个变量的更多细节
3. 在源中显示线程
在调试工具栏中,右键然后选择"在源中显示线程";接着按一下 F11 使调试器前进一个代码行,查看窗口左侧的滚动条槽,会看到如下所示黄色箭头后面的图形,作为线程标记,线程标记指示线程在此位置停止。
将指针悬停在线程标记上,此时会出现一个数据提示,告知你每个已停止线程的名称和线程 ID 号
4. 标记线程
点击下图中标记框,或在某条线程上右键点击标记,实现对当前线程标记
点击下图中标记框,仅显示标记的线程
在标记一些线程后,可以右键单击代码编辑器中的代码行,然后选择“将标记的线程运行到光标处”,这对于调试代码十分友好,不用打断点,再F5,就可以从当前线程所在位置运行到想要查看的代码行的位置。
Visual Studio 将在选择的代码行处暂停线程,这样就可以通过冻结和解冻线程更容易地控制执行顺序。 选择仅显示标记的线程按钮将再次切换回显示所有线程模式。 若要取消标记线程,请在“并行监视”窗口右键单击一个或多个已标记线程,然后选择“取消标记”。
5. 冻结和解冻线程
可以通过冻结和解冻(暂停和恢复)线程来控制线程执行工作的顺序。 这有助于解决并发问题,例如死锁和争用条件。
在“并行监视”窗口中,在选中某些行的情况下,右键单击并选择“冻结”。在第二个列中,对应行会出现一个暂停图标,如下所示
暂停图标指示该线程已冻结,切换到代码编辑器,按 F10、F11调试,仅运行未冻结的线程,也就是图中的177636线程,这样就可以实现在同一个线程上调试代码了。
任何新线程均处于未标记状态,不会被冻结。
右键单击某一行,然后选择解冻,暂停图标在此行上消失,表明线程已不再被冻结,恢复到之前的状态,如下图所示