1.1. 中断程序的执行
在本章前面讲到,调试器之所以能够在程序中设置断点,是由于符号文件的关系,而符号文件是用来保存程序中指令和源代码位置的一一对应关系的。因此微软的调试器除了提供了一般的在源代码文件里面设置断点以外,还支持在函数入口中断、在异常(Exception)发生的时候中断。
1.1.1. 设置函数断点
程序已经中断了,可能你现在做的第一件事就是找到程序的源文件,设置断点。如果源文件比较多的话,在这么多的源文件里面找到合适的源文件也不是一件容易的事情,特别是在有多个版本源文件同时存在的情况下,那更是一件费力的事情。其实你可以通过设置一个函数断点,让调试器自动帮你找源代码,我个人在使用CLR Debugger调试程序的时候, 第一步总是在Main函数上设置断点。
在CLR Debugger窗口的下方,有一个“Breakpoints”对话框(如果没有这个对话框的话,请点击菜单栏里的“Debug”菜单,然后依次点击“Windows”和“Breakpoints”菜单项即可显示这个对话框)。依次点击“New”和“Break at Function…”按钮弹出“New Breakpoint”对话框设置函数断点。如下图所示:
图 1-4 在CLR Debugger里面设置函数断点
在“New Breakpoint”对话框里,“Function”文本框用来设置在哪个函数入口中断程序的执行。你既可以提供只函数名,也可以提供函数的“命名空间.类名.函数名”函数的全名形式,这样可以缩小CLR Debugger的搜索范围—因为在CLR Debugger设置函数断点时,CLR Debugger会将所有函数名为指定的函数名的函数入口中设置断点。如果“Line”文本框里面的值不是1的话,则会在程序执行到函数入口(在C#程序中也就是“{”这个大括号)的后面n行中断程序的执行。“Language”下拉框只在你的程序是由多个编程语言编写的时候才有用—选择“Unknown”让调试器自己去猜测就可以了。
当要中断程序执行的函数名是一个重载函数时,CLR Debugger默认会在所有重载函数的入口中设置函数断点。可以在“Breakpoints”对话框里去掉不需要的函数断点,正如下图所示的那样:
图 1-5 在重载函数中选择函数断点