Visual Studio调试C#如何查看引发IndexOutOfRangeException的具体索引
Visual Studio 定位C#数组越界具体索引值的方法
完全可以通过Visual Studio原生调试功能直接定位触发异常的具体索引,不需要额外编写日志、打印变量的测试代码,操作方法如下:
- 先配置异常中断规则:打开顶部菜单「调试 > 窗口 > 异常设置」,在列表中找到
Common Language Runtime Exceptions > System > System.IndexOutOfRangeException,勾选前面的复选框。配置后只要代码触发索引越界异常,调试器会第一时间在异常抛出的原始位置中断,不会被业务代码里的try/catch逻辑跳转走,此时捕获到的变量值就是触发异常瞬间的准确值,不会被后续代码改动。 - 即时查看变量值:当调试器中断停在你提到的出错代码行时:
直接将鼠标悬停在代码里的2DArray[i,j] = 1DArray[k];i、j、k三个循环变量上,就能看到触发异常时三个索引的具体数值;再分别悬停在两个数组对象上,展开属性面板即可对比判断越界位置:- 二维数组
2DArray的GetLength(0)返回值是第一维(对应i索引)的合法长度,GetLength(1)返回值是第二维(对应j索引)的合法长度,和当前i、j的值对比,就能立刻判断是不是二维数组索引越界、具体是哪个维度的索引超出范围。 - 一维数组
1DArray的Length属性返回值是它的合法长度,和当前k的值对比,就能判断是不是一维数组的索引越界。
- 二维数组
- 如果觉得悬停查看效率低,可以直接调出「局部变量」窗口:走顶部菜单「调试 > 窗口 > 局部变量」即可打开,当前代码作用域内的所有循环变量、数组对象的全量属性都会以列表形式直接展示,不需要挨个悬停就能快速对比出非法索引。
- 针对偶发的、不容易复现的越界问题,可以给这行赋值代码添加条件断点:点击代码行左侧的编辑器边栏打普通断点,右键断点图标选择「条件」,输入判断规则
i >= 2DArray.GetLength(0) || j >= 2DArray.GetLength(1) || k >= 1DArray.Length,配置后只要索引即将出现越界,调试器就会提前中断,不需要等异常抛出就能看到当时的所有变量状态,排查效率更高。
内容的提问来源于stack exchange,提问作者29belgrade29
相关产品推荐
相关产品推荐

