记一次"未将对象引用设置到对象的实例"问题的排查过程
最近在给一个老项目做数据对接接口。
背景一
该项目最后更新日期为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 引用” 最 ...
随机推荐
- 微信小程序引用阿里巴巴矢量图标iconfont
最近在写微信小程序,但是引用图片,导致项目文件太大,所以就想到引用阿里巴巴矢量图标的方法 第一步:下载阿里巴巴矢量图代码: 第二步:将下载下来的文件中iconfont.ttf转换即可.转换地址:htt ...
- windows phone 页面主题设计
达到如图这个效果: 1.保证状态栏背景色与主题栏颜色相同需设置状态栏的透明度,代码如下: shell:SystemTray.IsVisible="True" shell:Syste ...
- 第一次接触Arduino
1.百度百科: Arduino包含两个主要的部分:硬件部分是可以用来做电路连接的Arduino电路板:另外一个则是 Arduino IDE,你的计算机中的程序开发环境.你只要在IDE中编写程序代码,将 ...
- 系统中 CPU 时间片是多久
Windows 系统中线程轮转时间也就是时间片大约是20ms,如果某个线程所需要的时间小于20ms,那么不到20ms就会切换到其他线程:如果一个线程所需的时间超过20ms,系统也最多只给20ms,除非 ...
- [USACO17FEB] Why Did the Cow Cross the Road I P (树状数组求逆序对 易错题)
题目大意:给你两个序列,可以序列进行若干次旋转操作(两个都可以转),对两个序列相同权值的地方连边,求最少的交点数 记录某个值在第一个序列的位置,再记录第二个序列中某个值 在第一个序列出现的位置 ,求逆 ...
- 读取bin文件,并且按结构体赋值打印
目标:读取一个bin文件,并且将bin文件中的数据,按字节对齐赋值给结构体,并且打印出结构体的内容 目前思路是简单的先将bin文件数据一次性读到一个数组中,再将数组强制转换为结构体 ] FILE *f ...
- Ajax兼容性问题
对于IE7及以上直接使用 XMLHttpRequest 就行,但对于过老版本IE建议直接提示用户下载新版浏览器更佳.或者用以下代码兼容IE6: function CreateXHR() { if(XM ...
- ASP.NET-SOAP、UDDI知识点
1. 什么是SOAP? 答:是简单访问协议.是在分布式环境中,交换信息并实现远程调用的协议.是一个基于XML的协议.使用SOAP,可以不考虑任何传输协议,但通常还是HTTP协议,可以允许任何类型的对象 ...
- HDU 1521
指数型生成函数.做这题时,回去看看组合数学才知道,指数生成函数求的就是多重集合的r排列数. #include <iostream> #include <cstdio> #inc ...
- ubuntu系统AndroidStudio改动内存大小
位于android-studio/bin文件夹下的studio64.vmoptions和studio.vmoptions文件. 把Xms,Xmx,-XX:MaxPermSize.-XX:Reserve ...