除了基类数据(如堆栈跟踪)之外,NullReferenceException背后的设计决策是什么,不包含任何运行时特定的信息?是否有Visual Studio的扩展,可以直接告诉你表达式的哪一部分为空?
Han*_*ant 70
NRE是一个非常低级别的例外.当处理器要求从64K以下的地址读取数据时,处理器会生成硬件异常("陷阱").虚拟内存空间的该区域始终未映射,特别是捕获指针错误.它以AccessViolation开始,当地址小于0x00010000时由CLR变为NRE.此时,异常的上下文非常少,所有已知的是导致陷阱的机器代码指令的地址.
将机器代码指令地址反向设计回程序中的命名变量是不可能的.重要的是它以这种方式工作,否则抖动必须生成非常低效的代码.可以合理地做的就是恢复源代码行号.这需要包含行号信息的调试信息(.pdb).CLR知道如何读取.pdb文件并使用它来生成异常的堆栈跟踪.但是,由于JIT优化器执行的优化,它通常仍然不准确,它会移动代码.您只能获得Debug构建的保证匹配.Release版本的PDB不包含源行号信息的原因.你可以改变它.
这个问题有一个非常简单的解决方案 在让运行时执行此操作之前,请自行检查null并生成您自己的异常.测试非常便宜,远小于纳秒.
Mar*_*erl 26
您可以将Visual Studio设置为NullReferenceException立即中断Throw,而不是先在catch块中中断.
然后你将在线上休息,导致NullReferenceException.
没有什么简单的方法可以确定运行时什么是null - 必须从IL中反编译和推断出必要的信息,这是足够低级的,它只知道"堆栈顶部的项目为空" "但不是那个项目如何到达那里.
(我不知道这样的扩展,但它将是一个很好的调试器增强功能)
| 归档时间: |
|
| 查看次数: |
9678 次 |
| 最近记录: |