记一次"未将对象引用设置到对象的实例"问题的排查过程
最近在给一个老项目做数据对接接口。
背景一
该项目最后更新日期为2006年,使用ASP.NET WebForm、.Net2.0、OJB、Castle Avtive Record等。由于是某集团的子系统之一,所以在获取人员信息时,必须使用已经封装好的组件。
背景二
接口对面是一个JAVA项目,一般这种老系统我都建议使用SOAP服务做对接,要是用Restful服务就得再新起一个接口项目专门做JAVA对接,然后再用老系统与接口项目对接,麻烦。结果同事去谈需求的时候压根没注意老项目的年代,一上去就奔着Restful服务去了,聊完以后人家两天就把代码写完了,我们这边懵逼了。让对方改代码也不现实,毕竟一开始是我们考虑欠妥。最后决定,把老项目升级到.Net4.0,直接使用WebAPI。
正文
升级过程非常顺利,编译也没有任何错误。运行一下,功能也都没有任何问题,心里一阵窃喜。那就到正式环境部署一版.Net4.0的跑跑吧,毕竟正式环境还是Windows Server 2003+IIS6.0。部署完毕以后启动后台登录页一看,傻眼了。
一开始以为是服务器配置的问题,结果把发布文件部署在本地也是同样的异常。很明显,这种异常只会出现在发布后的项目里。从调用栈里可以获取到一些信息,但是还是太少。想要调试发布的代码,可以使用VS自带的远程调试工具。
远程调试步骤就不多说,网上有很多例子。调试过程中会遇到无法命中断点的情况。
这种情况有可能是你要调试的项目没有载入断点符号,载入符号的具体步骤如下:
1.打开调试里的模块窗口。
2.找到项目的dll,右键点击加载符号,就能命中断点了。
通过调试发布以后的项目,发现有一处参数传值不正确。正常情况下,参数key的值应该是GetObjectByID,而这里竟然将构造函数传进来了。显然“未将对象引用设置到对象的实例”是由这个key造成的。
沿着调用栈继续往上找,发现一段这样的代码,根据调用栈获取调用函数的名称。也就是说,问题可能出现在skipStack上了。
随后,我将发布前和发布后的调用栈信息输出出来对比(左边是发布前,右边是发布后)。
从输出里可以看到,发布前比发布后多了一步函数调用(因为.Net2.0还不支持参数默认值,所以通过这种方式实现默认参数的效果)。
引起调用栈不一致的原因可能是在Release时,多出的一步调用被编译器优化掉了(我将VS的运行模式换成Release以后异常也能重现)。至于以前为什么没出现这样的问题,可能是当时的编译器优化能力没现在这么强吧,06年那会儿应该是VS2005。
至此,本次抓臭虫的任务圆满完成。
记一次"未将对象引用设置到对象的实例"问题的排查过程的更多相关文章
- SQL Sever无法打开链接对话框,未将对象引用设置到对象的实例。(AppIDPackage)
前几天刚做完系统,先装的是SQL Sever2008,装完后还试了一下,OK~没问题,然后就继续装VS2012等一些软件.搞到很晚没有继续试试就睡了,第二天运行SSMS出问题了..(如图 1.0 所示 ...
- WPF中未将对象引用设置到对象的实例
前几天,我开始了WPF的基础学习,一上来我就遇到了一个令我头痛的问题,按照书上的例子我写了一段属于自己的代码,一个简单的色调器.满心期待的编译运行,就出现了未将对象引用设置到对象的实例.我在网上查阅了 ...
- c#:未将对象引用设置到对象的实例--可能出现的问题总结(转)
1.c#:未将对象引用设置到对象的实例--可能出现的问题总结(转):http://www.cnblogs.com/KeenLeung/archive/2013/06/23/3150578.html
- IIS报错 未将对象引用设置到对象的实例。
在vs中运行正常的项目 ,发布到IIS总是提示 未将对象引用设置到对象的实例. 运行静态页面 html正常,只是打开.aspx页面的时候报错,在确保了数据库,配置,权限均正常的情况下. 错误原因:先安 ...
- 解决使用DevExpress开发错误:未将对象引用设置到对象的实例
在使用DevExpress是总是会出现一些状况.这次同事在他的机器上调试完成的代码发过来,却出现"未将对象引用设置到对象的实例"的错误,提示是Resources.resx的问题.另 ...
- asp.net 中Session的运用,及抛出错误“未将对象引用设置到对象的实例”
1. 页面载入后,必须要等到page_Load方法执行建立 page对象后才可以使用Session 2. 在.aspx和.cs文件中使用Session的区别 (1).aspx: Session[&qu ...
- 2014-08-26 解决HttpContext.Current.Session在ashx文件中出现“未将对象引用设置到对象的实例”的问题
今天是在吾索实习的第35天. 最近在使用HttpContext.Current.Session来获取Session["..."]的值时,常常会弹出错误——“未将对象引用设置到对象的 ...
- 一般处理程序中使用Session出现未将对象引用设置到对象的实例
遇到问题:未将对象引用设置到对象的实例 那就在你的一般处理程序中加入红色背景的代码吧 using System; using System.Collections.Generic; using Sys ...
- 解决:getWeatherbyCityName(city),服务器无法处理请求。 ---> 未将对象引用设置到对象的实例。
原文:getWeatherbyCityName(city),服务器无法处理请求. ---> 未将对象引用设置到对象的实例. 解决方法:不要直接使用 “服务引用” , 添加为 “Web 引用” 最 ...
随机推荐
- Flask-Restful
定义Restful的视图 安装:pip install flask-restful 如果使用Flask-restful,那么定义视图函数的时候,就要继承flask_restful.Resourse类, ...
- mysql学习 2
1.建立外键 create table <表名>( <字段> 字段类型 not null, <字段> 字段类型 not null, <字段> 字段类型 ...
- wechat4j开发所有jar包
wechat4j开发所需要的jar包合计,不用你去单独下载,已经全部包括 下载连接 wechat4j-lib.rar 如果你的服务是部署在新浪云计算SAE上的,那么下载这个jar合集 wechat4j ...
- GCC中的强符号和弱符号及强引用和弱引用
1. 强符号和弱符号 1.1 u-boot和kernel中的__weak指令 u-boot和kernel比较普遍地使用了__weak来定义函数. 在include\linux\compiler-gcc ...
- CorelDRAW 2018新增功能介绍
2018年4月11日,CorelDRAW 2018正式对外发布,最新版设计软件包已经过全面更新,是近几年来发行的最强大版本,可协助绘图专业人士将创意转换为令人惊艳的专业视觉设计.CorelDRAW 2 ...
- Ubuntu18.04解决鼠标移动到Gnome顶栏左上角窗口不能平铺( Activites Overview 界面),和应用程序扩展不好用问题。
在用习惯了GNOME我们知道一个很好的功能就是通过鼠标移动到Gnome顶栏左上角后所有打开的窗口就会平铺在显示器上方便我们选不同的窗口(Activites Overview 界面),苹果MAC系统也有 ...
- redis 篇 - list
list 类似于 Python list lpush key value 向列表append value lrange key start stop 获取下标从 start 到 stop 的value ...
- React-setState源码的理解
首先举一个最简单的例子: this.state={ a:1 } this.setState({ a:2 }) console.log(this.state.a)//1 可以说setState()操作是 ...
- Linux网络编程(一):一个简单的socket程序
服务器: /* *tcp_server.c */ #include <stdio.h> #include <sys/socket.h> #include <netinet ...
- 洛谷P1004 方格取数
网络流大法吼 不想用DP的我选择了用网络流-- 建模方法: 从源点向(1,1)连一条容量为2(走两次),费用为0的边 从(n,n)向汇点连一条容量为2,费用为0的边 每个方格向右边和下边的方格连一条容 ...