wenmo8 发布的文章

简介





定义于头文件 <stdexcept>

Memory窗口可用于查看特定位置的原始内存数据。前面介绍的Watch、Autos和Locals窗口可以查看位于内存特定位置的变量值,而Memory窗口则会显示存储在内存中的数据概貌。

打开窗口

  • 通过菜单栏打开
  • 快捷键打开
    Ctrl+Alt+M 数字(1...4)
    按下组合键后,状态栏如下

     

     然后在按数字键
    Memory 1多一组快捷键 Alt+6

窗口的使用

 

窗口的上方是工具栏:

  • Address
    要观察虚拟地址值,十六进制。可以将代码里的某变量按住拖动到地址栏,也可以手动填写,当你填写为十进制数时会制动转为十六进制
  • Columns
    内存数据按字节分列,这里可以设置一屏显示的列数,有如下选择

左侧是以观察的地址为首地址的地址列

 

右侧是滚动条,用户可以使用它观察周边位置的内存数据。唯一要注意的是它的使用并不常见。电脑的内存空间很大,因此如果内存包含标准的滚动栏,就很难在内存中找到指定的内容。因此,Memory窗口使用弹簧式滚动条,该滚动条的手柄一直将保持在列表中间。

右键点击窗口区域,弹出如下菜单

 

什么是OverflowException

就是溢出异常。这个一般是当在线程检查的上下文中执行的算术、强制转换或转换运算导致溢出时引发的异常。

继承



Object

前面有个案例最终查明原因是System.Convert.ToInt16的调用导致溢出异常:

0:000> !PrintException /d 4ee2e8f4
Exception object: 4ee2e8f4
Exception type:   System.OverflowException
Message:          值对于 Int32 太大或太小
InnerException:   <none>
StackTrace (generated):
    SP       IP       Function
    001EC094 1D3D8831 mscorlib_ni!System.Convert.ToInt32(Double)+0xc4bc19
当时核对了代码,代码里明明调用的是System.Convert.ToInt16(float value),为什么这里却抛出异常是调用System.Convert.ToInt32(Double)引起的呢。

要想查明原因,只有查看源代码。那我们看看DotNet48RTM的源代码:

在工程mscorlib的代码..\DotNet48RTM\Source\ndp\clr\src\BCL\system\convert.cs我们可以找到相关代码

public static short ToInt16(float value) {
            return ToInt16((double)value);
        }

可知ToInt16(float value)调用的是ToInt16(double value) ,那么ToInt16(double value) 的代码如下:

public static short ToInt16(double value) {
            return ToInt16(ToInt32(value));
        }

可知ToInt16(double value)调用的是ToInt32(double value),ToInt32(double value)的代码如下:

 public static int ToInt32(double value) {
            if (value >= 0) {
                if (value < 2147483647.5) {
                    int result = (int)value;
                    double dif = value - result;
                    if (dif > 0.5 || dif == 0.5 && (result & 1) != 0) result++;
                    return result;
                }
            }
            else {
                if (value >= -2147483648.5) {
                    int result = (int)value;
                    double dif = value - result;
                    if (dif < -0.5 || dif == -0.5 && (result & 1) != 0) result--;
                    return result;
                }
            }
           throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
        }

此时,我们也就明白了为什么抛出的是“值对于 Int32 太大或太小”的异常了,同时,我也比较担忧着个性能的问题。