摘要:

前几天,在园子里看了一个图片幻灯效果,很不错,不过今天想找却找不到了。这两天想把网站的图片幻灯效果给换了,原来的虽然做成了web控件,不过控件里硬编码了javascript和css,甚至还有document.write这样的输出,感觉很是不爽。偶然发现了一篇翻译文章如何使用 JavaScript 创建可维护的幻灯片效果,感觉原作者在构建可分离的javascript和css上颇有心得,不过这里和我想要的效果还有些差异,参照大部分国内网站的实现方式,应该能够实现定时的播放,同时在右下角还应该有一个序列号的指示,就像新浪网的首页那样,既然作者帮我们作了大部分的分离工作,剩下的这部分自己实现,也十分简单。

  阅读全文
posted @ 2008-07-04 13:16 BAsil 阅读(1547) | 评论 (10)编辑
我他妈的要是再看中国队的球我就是王八羔子
posted @ 2008-06-07 21:50 BAsil 阅读(191) | 评论 (5)编辑
     摘要: 画了两张UML图,帮助理解asp.net 2.0的页面即时编译,建议结合Reflector查看
  阅读全文
posted @ 2008-06-04 21:46 BAsil 阅读(2639) | 评论 (13)编辑
最近在看《ASP.NET 2.0服务器控件与组件开发高级编程》,其中有一个以前没有注意的细节,思索了好久,还是没有答案,还请各位帮忙指点一下。
服务器控件,注意CardholderNameText是存到ViewState当中的
    public class CreditCardForm : Control
    
{
        
public CreditCardForm()
        
{
        }

        
public string CardholderNameText
        
{
            
get return ViewState["CardholderNameText"!= null ? (string)ViewState["CardholderNameText"] : "CardholderName"; }
            
set { ViewState["CardholderNameText"= value; }
        }

        
protected override void Render(HtmlTextWriter writer)
        
{
            writer.Write(
"<strong>" + CardholderNameText + "</strong>");
        }

    }
调用的页面,我放置了一个button,以便观察Postback的值是否发生改变,另外设置了CardholderNameText属性
   <form id="form1" runat="server">
    
<div>
       
<custom:CreditCardForm CardholderNameText="Full Name(Initialize)" runat="server" ID="creditcardform" />
        
<asp:Button ID="Button1" runat="server" Text="Button" /></div>
    
</form>
调用页面的后台代码,很简单
void Page_Load(object sender, EventArgs e)
  
{
    
if (!IsPostBack)
    
{
      creditcardform.CardholderNameText 
= "Full Name(After Postback)";
    }

  }
在页面第一次请求的时候,执行aspx编译生成的Page子类的AddParseSubObject,将控件加入到Controls集合中,并设置了CardholderNameText的值为"Full Name(Initialize)",由于是第一次加载在Page_Load中修改了值为"Full Name(After PostBack)",到这里没有问题。
当我点击button提交,第二次请求页面时,我在调试器里发现再一次设置了CardholderNameText的值为"Full Name(Initialize)",但是页面却显示Name(After PostBack)",不知道怎么回事。
我怀疑是和Page的AddParseSubObject有关,因为它是在整个生命周期的最开始执行,会不会是此时的ViewState还没有生效?希望能给与解答!!谢谢
源代码附上CreditCardForm
原因:
结果和AddParseSubObject无关,原因实际很简单,怪自己看得不仔细,乱扣帽子,引用wit的回复
回传时,第一步任然解析html,并且设置CardholderNameText为:Full Name(Initialize),此时 视图里的值也为这个,因为该属性保存在视图里。

下面就是重载视图了,会根据客户端form请求的值,重新加载视图状态,
这时就把第一次访问后的视图值加载过来(将Full Name(After Postback))

所以就是你的结果了···
posted @ 2008-05-20 11:34 BAsil 阅读(771) | 评论 (6)编辑
     摘要: Linq to sql给我们的orm影射带来了极大的便利,实体类写很少的代码就可以完成数据库表的增删查改,也使我们能够更加专注于业务逻辑;而Xml的应用也是相当广泛,如今的SOA很大程度上是利用了Xml格式的SOAP消息来进行交互。有的时候我们会碰到需要读取xml保存到数据库的情况,在没有Linq的时候,可能我们会通过XmlSerializer的Deserialize方法来反序列化Xml生成相对应的net class,然后操作net class插入数据库,如果不采用orm的话,代码量和利用XmlDocument直接操作Xml更新数据库没有什么差别,那么现在有了Linq to sql,反序列化的net class和Linq to sql的Entity可以优雅的结合到一起,看看减轻了我们多少的工作量?  阅读全文
posted @ 2008-04-25 10:43 BAsil 阅读(1951) | 评论 (10)编辑
     摘要: 折腾了近两天,这个500的问题终于解决了,我都快崩溃了,我的笔记本是xp sp2,vs2005 vsts,sql2005 dev,biztalk en r2 eval版,作了Adapter Useages的HTTPRequestResponse个例子,在http://localhost/RequestResponse/default.aspx中点击提交按钮,正常的应该是调用http adapter返回response 可是却报500的错误,网上关于这个问题的帖子很多,但是解决方案就是那么几种,转过来转过去的,没有什么帮助,并且大都是window 2003 iis6的解决,我在window 2003 iis6下测试没有问题。下面我把我的解决思路整理一下,问题到最后解决很简单,就那么一下子,但是我却走了不少弯路,希望以后碰到问题的时候能够尽快地定位到错误点。
  阅读全文
posted @ 2008-04-16 16:25 BAsil 阅读(1226) | 评论 (7)编辑
     摘要: 暂时放到首页,希望dudu看到,如有不妥,可以撤下。
用手机浏览博客园已经有一个多月了,感觉好像已经成了生活的一部分,习惯了每天晚上睡觉前捧着我的Treo 650看上几篇博客,Palm宽大的屏幕,配上细腻而柔和的背光,看上几个小时都不觉得累,那感觉真是不错。呵呵,扯远了,说说我认为手机版博客园需要改进的地方吧(优点我就不说了,太多了)。
  阅读全文
posted @ 2008-03-22 22:39 BAsil 阅读(2382) | 评论 (21)编辑
     摘要: 我下载了源代码,却发现总是无法调试。后来偶然发现VS2005的输出窗口显示“不包含源服务器信息”,我仔细比对了网上提供的三个step,检查了VS编译器的设置,发现了问题。我的设置Debugging->General->Enable Just My Code(Managed Only)为选中,而网上的图例未选中。修改了这个设置后,发现可以正确的调试源代码了。
不过我认为应该把这个细节强调一下,毕竟不是每个人都熟悉vs05的,我工作中一直用vs03,vs03中没有这个选项。

  阅读全文
posted @ 2008-03-22 21:53 BAsil 阅读(2226) | 评论 (3)编辑
在CS 2.0下,使用了大量的Ajax来提高用户体验,比如AjaxPager来实现无刷新翻页,以后有时间会把AjaxPager讨论一下。
大家可能知道,在CS里面,登录是专门放到一个页面来处理的,当点击首页时,跳转到登录页面。这样做的好处是逻辑比较清楚,代码比较简单。但缺点是每次登录完后需要重新跳转到首页,增加了用户的等待时间。而我们在二次开发的过程中,很多时候希望在首页上直接有登录的区域,类似很多门户网站的操作,但是又不希望每次登录都PostBack,这样的话采用了Ajax。下面是我开发的登录控件的过程,另外由于我现在工作的环境主要还是framework 1.1,所以开发的这个登录控件也可以在1.1环境下使用。
先说一下开发的思路,由于原来CS的登录也是做成了控件的形式,通过AnonymousTemplate和LoggedInTemplate模版来配置登录时和登录后的页面,在后台完成相应的代码,也就是和Asp.net 2.0里的登录控件差不多(2.0里面简单看了看,可能比较类似)。因此改造登录控件时,我也希望延用这种方式,再把Ajax加上去。
其实在之前我也写了一个基于CS的登录控件,但是感觉不够模块化,那个控件采用了Ajax的Anthem第三方开源控件,但是正如上一篇文章CommunityServer 2.0中的Ajax和Anthem比较提到的,由于只有标识为UpdateAfterCallBack=true的控件才能够完成无刷新更新,如果页面的控件比较多,而且Asp.net控件和Anthem控件堆到一起时,代码非常的乱;另外Anthem的脚本会自动生成到aspx页中,个人感觉不便于缓存,而且如果首页上只有登录控件使用Anthem,也会生成大量的Anthem脚本文件,很是不爽。而CS2.0的Ajax,给人感觉代码比较简洁,有的时候也比较灵活。因此采用了CS 2.0的Ajax来完成,重构后的登录控件和页面耦合度更低,可以放置到各个页面而且不需要修改代码,另外可以通过Template来更改布局。
下面来看一下代码:
AjaxManager.cs这是CommunityServer中用来封装Ajax的一些代码
global.js CommunityServer中实现Ajax_CallBack的脚本
TemplateWebControl CS中用来实现皮肤调用的基类,在CS中只要有类继承此类,就需要有对应的皮肤
Login.cs 继承了TemplateWebControl,相当于一个容器
LoginView.cs 这里为了方便,直接继承了Panel,但是参考原有CS的实现,使用了ITemplate
AnonymousUserCtrlComplex.cs 匿名用户看到的内容
RegisteredUserControl.cs 登录用户看到的内容
这里着重看一下LoginView的部分代码
[PersistChildren(false), ParseChildren(true)]
    
public class LoginView : Panel,INamingContainer
    
{
        
protected override void OnInit(EventArgs e)
        
{
            
base.OnInit (e);
        
            AjaxManager.Register(
this,"Login");
        }


        
public LoginView()
        
{

        }

        [AjaxMethod(IncludeControlValuesWithCallBack
=true)]
        
public string ValidUser(string user,string password)
        
{
            
//CommunityServer.Components.User userToLogin = new CommunityServer.Components.User();
            string redirectUrl = null;
            
            
if(user=="admin" && password=="admin")
            
{
            
                FormsAuthentication.SetAuthCookie(user, 
false);
            
            }

            StringWriter stringWriter 
= new StringWriter();
            HtmlTextWriter htmlWriter 
= new HtmlTextWriter(stringWriter);            


            
this.Controls.Clear();
            
this.ChildControlsCreated=false;
            
this.Page.DataBind();
            
this.Render(htmlWriter);

            

            
return stringWriter.ToString();
        }

        
public override void DataBind()
        
{
            
this.EnsureChildControls();
            
base.DataBind ();
        }

        
protected override void CreateChildControls() 
        
{
            
this.Controls.Clear();
            
this.ChildControlsCreated=false;
            ITemplate template  
= null;

            
if(!Context.User.Identity.IsAuthenticated)
            
{
                template 
= AnonymousTemplate;
            }

            
else
            
{
                template 
= LoggedInTemplate;                
            }


            
if(template != null)
            
{
                
//basilwang 2008-02-26 没有采用原有CS增加Control的方式,而保持AnonymousTemplate的Parent为LoginView
                
//Control cntrl = new Control();
                
//template.InstantiateIn(cntrl);
                template.InstantiateIn(this);
                
//this.Controls.Add(cntrl);
            }

            
        }

        
        [
        Browsable( 
false ),
        DefaultValue( 
null ),
            Description( 
"TODO SkinTemplate Description" ),
        PersistenceMode( PersistenceMode.InnerProperty ),
        ]
        
public ITemplate AnonymousTemplate 
        
{
            
get {return _anonymousTemplate;}
            
set {_anonymousTemplate = value;}
        }

        
private ITemplate _anonymousTemplate;

        [
        Browsable( 
false ),
        DefaultValue( 
null ),
        Description( 
"TODO SkinTemplate Description" ),
        PersistenceMode( PersistenceMode.InnerProperty ),
        ]
        
public ITemplate LoggedInTemplate 
        
{
            
get {return _loggedInTemplate;}
            
set {_loggedInTemplate = value;}
        }

        
private ITemplate _loggedInTemplate;

    }

 注意AjaxManager.Register的注册时间,是在生命周期的最开始Init完成的
 另外对于CallBack的函数一定要加上[AjaxMethod(IncludeControlValuesWithCallBack=true)]
 那么对于回调生成的html,这里我向老赵学习,尽量通过framework生成规整的html,当然这里也费了我很多的时间
 由于采用了模版ITemplate,而模版在AddParsedSubObject的时候只是add到Control集合当中,注意此时并没有调用模版的CreateChildControls方法,那么什么时候这些方法会被调用呢,我开始一直认为是在Page的PreRender,但是通过Reflector发现Page的PreRenderRecursiveInternal在执行完this.EnsureChildControls()后(此时还没有递归调用他的子控件的PreRender),紧接着处理 this.OnPreRender(EventArgs.Empty);但是由于我们的Ajax方案是在PreRender时候即返回了结构,所以总是得不到Template的值。后来我使用了DataBind(建议大家在使用模版ITemplate时,别忘了DataBind这个好用的方法),因为DataBind()有一个递归EnsureChildControls()方法,可以帮助我们把所有的子控件都给创建出来,最后的事情就比较简单了,Render出来就可以了。
 另外在WebForm1.aspx页面上一定要加

{
            
//base.VerifyRenderingInServerForm(control);
        }

 防止CallBack时框架验证是否包含在服务器端Form中,这也是我觉得不爽的地方

asp.net1.1源代码附上LoginAjax.rar,asp.net 2.0下面也可以用,做一下转换即可
posted @ 2008-02-26 01:31 BAsil 阅读(1997) | 评论 (4)编辑
     摘要: 在园子里面的兄弟为aspx和mvc的争论不休的时候,由于工作的关系,我还在用着可怜的framework1.1,我没有使用过Asp.net ajax(1.1不支持),所以这里我把CommunityServer 2.0中的Ajax和Anthem作一下比较;当然也是为我的下一篇文章基于CommunityServer 2.0二次开发之登录控件做一个铺垫,稍后奉上。
  阅读全文
posted @ 2008-02-25 22:05 BAsil 阅读(2225) | 评论 (8)编辑

最近总是感觉电脑不大正常,可是瑞星杀毒总是不抱错,瑞星防火墙偶尔会报出一串数字命名(位数不确定)的exe文件试图访问网络。从网上搜了一下,很多都是说8位的数字病毒。可是我的数字exe文件有的时候是11位有的时候是12位,另外Windows的Temp文件夹下还有很多4位的exe文件。前天晚上怒了,自己跑到安全模式system32下杀文件,看着不顺眼的就干掉,结果杀红了眼,不小心把几个后缀名是nls的文件给杀掉了,结果导致机器无法启动,害得我只好用ERD Commander配合Recover4all将误杀文件恢复,真是郁闷。
昨天晚上,在用sreng扫描进程模块信息时,发现好多进程下面都关联了两个动态链接库udbajj.dll,systen.dll,在网上搜了一下,关于systen.dll的内容不少,确定是一个木马,udbajj.dll网上没有介绍,不过我在system32文件下找到udbajj.dll文件时,可把我惊出一身冷汗,我找到一个udbajj.key的文件,打开一看,我所有的键盘操作包括运行的软件全部被以名文的形式记录下来,另外发现和systen.dll相关的也有几个日志文件,不过都加密了,估计也不是什么好东西。另外我发现系统被木马建立了四个以$打头的管理员权限的帐号,晕倒。


我用PowerRmv强制将这两个文件粉碎掉,把注册表里的相关信息全部杀掉。这样随机生成的访问网络的数字exe文件也不再生成了。
另外我也发现了删除autorun病毒的方法,把每一个盘符下面的autorun.inf文件和msn.exe文件都用PowerRmv粉碎,然后找个autorun的金山专杀禁止硬盘的自动运行,就ok了。

posted @ 2007-12-01 11:11 BAsil 阅读(513) | 评论 (0)编辑

TREO 650买回来已经三天了,试用了N多的软件,重起了不下五十次,现在基本成长为一名合格的初胖了。下面把我的一些经验教训给大家总结一些。
1 有天突然发现浏览器和快速学习都造成重起,通过#*377发现报Blazer错误,可能快速学习调用了Blazer,百度一下发现很多帖子都描述其和Clipro造成重起,可是我的Clipro用uninstall确
却无法删除,总是报数据库已经打开,用Resco Explorer可以在Plam-dm下发现该文件正在使用,仍无法删除,后来发现通过Mcfile可以删除。删除后问题解决。
2 我的胖子设置Ringo的Mp3铃声重起,无奈安装Mring,正在测试稳定性。安装了Hi-launcher,无奈打开菜单时重起,现在用Dalauncher。

3 用Tcpmp播放电影时经常卡,并报Out of memory错误。后来安装DBcachetool,问题解决
4 我在安装了Dbcachetool系统变得很慢,每打开一个程序都执行一次。没办法关闭自动清除,装了一个Dbcacheda,手动执行。

以上为在Treo的记事本写的,有空把其他的心得一块补上来。这几天得抓紧工作了,让treo折腾得够呛,电脑都中了一个down(0).exe的病毒,还没杀掉呢。

posted @ 2007-11-07 22:29 BAsil 阅读(178) | 评论 (5)编辑

最近发现服务器总是不工作不正常,cygwinsvr.exe进程cpu占用率过高,因为cygwin装上去以后就没有用过,打算将其删除,可是找了半天没有找到卸载程序,这时才想到毕竟是*nix移植过来的程序。好容易在网上发现的卸载需要在cygwin shell下运行,执行以后报可能存在多个Cygwin1.dll。搜索了一下发现安装的OpenSSH下面还有一个Cygwin1.dll,停止Opensshd服务,删除Cygwin1.dll。执行Cygwin Shell,问题解决,cpu占用率恢复正常。

posted @ 2007-10-27 11:19 BAsil 阅读(446) | 评论 (0)编辑

项目开发一直采用的是vs.net+vss,可是vss只支持局域网。最近总是跑来跑去,开发起来很麻烦,希望能有一个远程的源代码管理器可以简化开发。cvs的一套早就听说过了,可是一直担心不能和vs.net好好的整合。今天突然有个念头,为什么非要整合阿--两个独立起来,cvs负责源代码管理而vs.net专注开发不是更好吗?

花了一个晚上搭建了一个cvsnt + wincvs环境,还算比较简单,碰到的问题也都解决了,不过还是列一下

1.wincvs需要首先安装pathon和tcl,其中pathon版本不能高于2.2.3,而tcl我用的是tcl832.exe,另外pathon需要配置一下环境变量

2.wincvs 1.3中文版设置CVSRoot的路径要求采用unix方式,刚开始采用E:\XantalServer\XantalServer4CVS,报no such repository,后改为/XantalServer/XantalServer4CVS,问题解决

今天就到这里了,明天看看把vs项目的源代码添加进来,不知道还会碰到什么问题,先不管他了。

 

ps 我就是那匹叫做春丽的马

posted @ 2007-10-10 22:43 BAsil 阅读(265) | 评论 (0)编辑

最近总是感觉比较累,这学期的带的班又比较多,每天晚上回到家一点力气都没有,只想睡觉。项目的一部分需求总是定不了,Coding的时候总是没底。学习的干劲也不是很足,从当当网买的《代码大全》还扔在那里没看呢。现在想象,前段时候忙起来真的是很充实阿,希望这一篇博客能让我重新回到原来的生活中,吼吼,怀念一下。

 

打算最近看一下代码大全,不过能从里面学到什么,看看书评可是挺玄的。

Code Complete, Second Edition
by Steve McConnell

Read more about this title...

打算买一个二手的treo 650,不过在斗争了两三天以后决定放弃了,贴一个图片,以此纪念。

posted @ 2007-09-14 10:25 BAsil 阅读(52) | 评论 (0)编辑
Still need to config more utility to use it. I am on the way :-)
posted @ 2007-09-10 22:58 BAsil 阅读(47) | 评论 (0)编辑

大家都知道Community Server中使用了Url Rewrite,但是对于希望通过CS学习Url Rewrite的朋友,可能稍微难了一点,因为CS项目确实是相当的繁杂,我们不容易对Url Rewrite做一些有针对性的调试。

我在这里把涉及到UrlRewriting的部分抽取出来,做成一个Demo,使大家可以从中了解到CS是怎么针对UrlRewriting进行设计和应用的。

其中用到的类简单的列一下

Configuration/CSConfiguration.cs 取得communityserver.config中的内容

HttpModule/CSHttpModule.cs   在Begin_Request时执行UrlRewriting

SiteUrlsData.cs 取得SiteUrls.config中内容,定义url rewrite 重写的规则

SiteUrls.cs    匹配url rewrite重写的规则

CSContext.cs 每个请求会产生一个CScontext上下文

CSCache.cs  缓存

Globals.cs 全局的属性和方法,大部分注释掉

Openlab.Controls.OLPage  宝玉的重写的Page类,和CS中的CSPage完全一样,这里就不改了,主要是保证重写后的action仍然指向虚拟的url,具体的内容大家可以看看宝玉关于url rewrite的一篇文章。

forums/printpost.aspx  无后台cs类,在web.config中使用的pageBaseType起作用。我在测试中发现,只有aspx页面没有后台的cs类,才会调用pageBaseType中的类,网上很多朋友也碰到这个问题,不知道大家是怎么解决的。

forums/showpost.aspx  直接继承Openlab.Controls.OLPage类。

在web.config中,这样写

<pages pageBaseType="Openlab.Controls.OLPage, Openlab"/> <httpModules> <add name="UrlRewritingTest" type="UrlRewritingTest.CSHttpModule, UrlRewritingTest" /> </httpModules>

在communityserver.config中,别忘了

 

<communityserver> <core> <providers> <add name = "SiteUrlsDataProvider" type = "UrlRewritingTest.Components.SiteUrlsData, UrlRewritingTest" path = "siteurls.config" /> </providers> </core> </communityserver>

在浏览器中输入http://localhost/UrlRewritingTest/forums/1/PrintPost.aspx

http://localhost/UrlRewritingTest/forums/1/3/ShowPost.aspx

代码下载:CSUrlRewriting.zip

下载后,把CSUrlRewriting中的UrlRewritingTest映射为localhost/UrlRewritingTest即可。

posted @ 2007-04-01 21:35 BAsil 阅读(2663) | 评论 (3)编辑
     摘要: 在读Clinglingboy的asp.net控件开发基础(18)时,Clinglingboy对其进行了重点讲解。可是我感觉在如何将具有IListSource接口的数据源最终转化为DataView说的还不是十分清楚,下面我这一部分再详细的说一下。首先还是贴一下关键的DataSourceHelper类DataSourceHelperCode highlighting produced by Actip...  阅读全文
posted @ 2007-03-12 13:21 BAsil 阅读(2387) | 评论 (6)编辑

 

我和老婆,摄于2007年1月28日山东荣成

posted @ 2007-03-06 22:03 BAsil 阅读(176) | 评论 (2)编辑

两天前,研究控件状态问题是,看到了思归的这篇文章思归的“动态控件的状态问题”的分析,对其中用跟踪TrackViewState用到的工具winDbg比较好奇,经过摸索,现在把实现的步骤列一下:
1安装、部署winDbg、配置SOS,这个网上已经讲得比较多了,这里我就不多说了,列出我参考过的几个链接
 Mike Taulty's Blog的
 A word for WinDbg
 A word for WinDbg(2)
 More on debugging with SOS.DLL - enter Visual Studio
 博客园flier的用WinDbg探索CLR世界的一系列文章
2调试ASP.Net参考的文章
 在托管代码中设置断点(WINDBG) 
 ASP.NET 崩溃-SiteMap中疯狂的循环 
 用WinDbg动态脱Reflector
 WinDbg / SOS Cheat Sheet 
 ASP.NET Performance Case Study: Web Service calls taking forever
这里也写一下我的步骤,由于我对托管和非托管代码的一些概念都不甚清楚,可能有的命令用的不恰当,但例子确实是工作了,写到这里只是希望抛砖引玉。另外这里的操作是基于asp.net1.1的,我对于调试asp.net2.0步骤还没有理顺,后面我也会把我的一些问题列出,还请高手们不吝赐教。
1.设置path变量
 这里是指 我的电脑-〉属性-〉高级-〉环境变量中path的设置,在其后加上sos.dll的路径,注意一定不要将原来的path内容删掉,可能与其他程序关联
  我本机上是C:\WINNT_1\Microsoft.NET\Framework\v1.1.4322;
2.打开windbg,选择File->Symbol File Path,这里我写的是
  SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols;
  c:\winnt_1\symbols;
  C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\symbols;
3.按F6或者是File->Attach to a process,选择aspnet_wp进程,注意此时最好保证你的aspx页面尚未执行
4.在命令窗口依次输入.load sos 
                   .loadby sos mscorwks
            .chain (查看是否正确load)
 本文windbg的命令如果没有声明均为小写,比如name2ee,我在help中查到的是Name2EE,但是我输入的时候不识别
  我本机显示
  Extension DLL search Path:
    C:\Program Files\Debugging Tools for Windows\winext;C:\Program Files\Debugging Tools for Windows\winext\arcade;C:\Program Files\Debugging Tools for Windows\W2KFre;C:\Program Files\Debugging Tools for Windows\pri;C:\Program Files\Debugging Tools for Windows;C:\Program Files\Debugging Tools for Windows\winext\arcade;C:\WINNT_1\system32;C:\WINNT_1;C:\WINNT_1\System32\Wbem;C:\Sybase\dll;C:\Sybase\bin;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;C:\Program Files\Sybase\Sybase Central\win32;C:\Sybase\ASEP;C:\Program Files\ATI Technologies\ATI Control Panel;C:\Program Files\Sybase\SQL Anywhere 7\win32;C:\Program Files\Sybase\Shared\Web Targets;C:\Program Files\Sybase\Shared\PowerBuilder;c:\Program Files\Microsoft SQL Server\90\Tools\binn\;C:\WINNT_1\Microsoft.NET\Framework\v1.1.4322;C:\WINNT_1\Microsoft.NET\Framework\v2.0.50727
Extension DLL chain:
    sos: API 1.0.0, built Fri Feb 21 10:47:40 2003
        [path: C:\WINNT_1\Microsoft.NET\Framework\v1.1.4322\sos.dll]
    C:\WINNT_1\Microsoft.NET\Framework\v2.0.50727\sos.dll: image 2.0.50727.42, API 1.0.0, built Fri Sep 23 15:27:26 2005
        [path: C:\WINNT_1\Microsoft.NET\Framework\v2.0.50727\sos.dll]
    C:\WINNT_1\Microsoft.NET\Framework\v2.0.50727\sos: image 2.0.50727.42, API 1.0.0, built Fri Sep 23 15:27:26 2005
        [path: C:\WINNT_1\Microsoft.NET\Framework\v2.0.50727\sos.dll]
    C:\WINNT_1\Microsoft.NET\Framework\v1.1.4322\sos: API 1.0.0, built Fri Feb 21 10:47:40 2003
        [path: C:\WINNT_1\Microsoft.NET\Framework\v1.1.4322\sos.dll]
    dbghelp: image 6.6.0007.5, API 6.0.6, built Sun Jul 09 04:11:32 2006
        [path: C:\Program Files\Debugging Tools for Windows\dbghelp.dll]
    ext: image 6.6.0007.5, API 1.0.0, built Sun Jul 09 04:10:52 2006
        [path: C:\Program Files\Debugging Tools for Windows\winext\ext.dll]
    uext: image 6.6.0007.5, API 1.0.0, built Sun Jul 09 04:11:02 2006
        [path: C:\Program Files\Debugging Tools for Windows\winext\uext.dll]
    ntsdexts: image 5.00.2195.6618, built Tue Nov 19 08:21:06 2002
        [path: C:\Program Files\Debugging Tools for Windows\W2KFre\ntsdexts.dll]
 
5.再输入!name2ee System.Web.dll System.Web.UI.WebControls.ListItemCollection.TrackViewState
  显示
   succeeded
Loaded Son of Strike data table version 5 from "C:\WINNT_1\Microsoft.NET\Framework\v1.1.4322\mscorwks.dll"
--------------------------------------
not created yet
-----------------------
表明线程尚未执行
6.运行VS2003 IDE的F5执行aspx页面
7.在windbg的窗口输入g,表示继续调试
 显示
 0:000> g
ModLoad: 7b0a0000 7b1cc000   c:\winnt_1\assembly\gac\system\1.0.5000.0__b77a5c561934e089\system.dll
ModLoad: 7b490000 7b506000   c:\winnt_1\assembly\gac\system.drawing\1.0.5000.0__b03f5f7f11d50a3a\system.drawing.dll
ModLoad: 7bc10000 7bd5a000   c:\winnt_1\assembly\gac\system.xml\1.0.5000.0__b77a5c561934e089\system.xml.dll
ModLoad: 7a6e0000 7a81e000   c:\winnt_1\assembly\gac\system.data\1.0.5000.0__b77a5c561934e089\system.data.dll
ModLoad: 07a30000 07a6e000   c:\winnt_1\assembly\gac\system.enterpriseservices\1.0.5000.0__b03f5f7f11d50a3a\system.enterpriseservices.dll
ModLoad: 7a2a0000 7a2b2000   c:\winnt_1\assembly\gac\system.web.regularexpressions\1.0.5000.0__b03f5f7f11d50a3a\system.web.regularexpressions.dll
ModLoad: 10a70000 10a75000   c:\winnt_1\assembly\gac\microsoft.visualc\7.0.5000.0__b03f5f7f11d50a3a\microsoft.visualc.dll
ModLoad: 7a000000 7a018000   c:\winnt_1\assembly\gac\system.directoryservices\1.0.5000.0__b03f5f7f11d50a3a\system.directoryservices.dll
ModLoad: 79640000 79692000   c:\winnt_1\assembly\gac\system.runtime.remoting\1.0.5000.0__b77a5c561934e089\system.runtime.remoting.dll
ModLoad: 79550000 79574000   c:\winnt_1\assembly\gac\system.runtime.serialization.formatters.soap\1.0.5000.0__b03f5f7f11d50a3a\system.runtime.serialization.formatters.soap.dll
ModLoad: 53760000 5376a000   c:\winnt_1\assembly\gac\cscompmgd\7.0.5000.0__b03f5f7f11d50a3a\cscompmgd.dll
ModLoad: 79430000 7947c000   C:\WINNT_1\Microsoft.NET\Framework\v1.1.4322\MSCORJIT.DLL
ModLoad: 777e0000 777e7000   C:\WINNT_1\system32\version.dll
ModLoad: 75950000 75956000   C:\WINNT_1\system32\LZ32.DLL
(5a4.224): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00000000 ecx=00000101 edx=ffffffff esi=00000000 edi=00000000
eip=77f9193c esp=07f5ffa8 ebp=07f5ffb4 iopl=0         nv up ei ng nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000286
ntdll!DbgBreakPoint:
77f9193c cc              int     3
8.此时System.Web.UI.WebControls.ListItemCollection.TrackViewState仍然没有被创建,你可以试着输入!name2ee System.Web.dll System.Web.UI.WebControls.ListItemCollection.TrackViewState查看
9.再次输入g,此时页面全部载入,你可以在浏览器看到页面已经呈现出来了.不过在windbg的窗口可能显示debuggee is busying, 意思是被调试的进程也就是aspnet_wp正忙,这里我们可以不管它,按ctrl+break结束掉,此时System.Web.UI.WebControls.ListItemCollection.TrackViewState已经创建,输入!name2ee System.Web.dll System.Web.UI.WebControls.ListItemCollection.TrackViewState查看
 显示
!name2ee System.Web.dll System.Web.UI.WebControls.ListItemCollection.TrackViewState
--------------------------------------
MethodDesc: 82c3fb0
Name: [DEFAULT] [hasThis] Void System.Web.UI.WebControls.ListItemCollection.TrackViewState()
-----------------------
得到MethodDesc: 82c3fb0
10. 接下来输入!dumpmd 82c3fb0  你如果对这些方法不熟悉的可以查阅前面的参考文章或者google一下
 显示
Method Name : [DEFAULT] [hasThis] Void System.Web.UI.WebControls.ListItemCollection.TrackViewState()
MethodTable 82c4194
Module: 17f1a8
mdToken: 0600172f (c:\winnt_1\assembly\gac\system.web\1.0.5000.0__b03f5f7f11d50a3a\system.web.dll)
Flags : 80
Method VA : 082af9f8
得到 Method VA : 082af9f8
11.接下来输入
0:010> sxe ld:System.Web.dll   设置模块加载断点
0:010> bp 082af9f8  给得到的Method VA设置断点
12.刷新aspx页面,同时在windbg中输入g继续运行
  显示
  Breakpoint 0 hit
eax=05707e08 ebx=056f0a9c ecx=05707e08 edx=00000002 esi=05707d28 edi=05707e08
eip=082af9f8 esp=00ebf83c ebp=00ebf84c iopl=0         nv up ei pl nz ac po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000212
082af9f8 55              push    ebp
Breakpoint 0 hit表明运行到断点处
13.输入!clrstack查看
 显示
Thread 1
ESP       EIP    
00ebf83c  082af9f8 [DEFAULT] [hasThis] Void System.Web.UI.WebControls.ListItemCollection.TrackViewState()
  at [+0x0] [+0x0]
00ebf840  082af9e5 [DEFAULT] [hasThis] Void System.Web.UI.WebControls.ListControl.TrackViewState()
  at [+0x25] [+0x11]
00ebf854  082aea4e [DEFAULT] [hasThis] Void System.Web.UI.Control.InitRecursive(Class System.Web.UI.Control)
  at [+0x136] [+0xc5]
00ebf894  0824ec8c [DEFAULT] [hasThis] Void System.Web.UI.Control.AddedControl(Class System.Web.UI.Control,I4)
  at [+0xd4] [+0x97]
00ebf8c4  0824eb9b [DEFAULT] [hasThis] Void System.Web.UI.ControlCollection.Add(Class System.Web.UI.Control)
  at [+0x113] [+0xb2]
00ebf900  0820067b [DEFAULT] [hasThis] Void DDLViewStateTest.WebForm1.Page_Load(Object,Class System.EventArgs)
  at [+0x9b] [+0x46]


至此我们得到了思归在页面中的结果.


几个问题:
1.由于本机是win2000 pro版且asp.net1.1和2.0共存,我的2.0程序通过WebDev.WebServer.exe进程显示,但是我在加载此进程调试是总是不成功,经常显示类似thread not a managed thread
2.关于.loadby sos mscorwks 的确切含义,我在有的文章上看到调用sos.dll 2.0时用到,但好像不太对.我现在的处理是不管在1.0还是2.0都输入这句命令
3.在用!dumpmd <method desc>查看具体的方法描述时,有的时候得到
Method Name : [DEFAULT] [hasThis] Void System.Web.UI.WebControls.ListItemCollection.TrackViewState()
MethodTable 82c4194
Module: 17f1a8
mdToken: 0600172f (c:\winnt_1\assembly\gac\system.web\1.0.5000.0__b03f5f7f11d50a3a\system.web.dll)
Flags : 80
Method VA : 082af9f8
而调试其他代码有时候得到
0:010> !dumpmd 8153e68
Method Name : [DEFAULT] [hasThis] Void System.Web.UI.IStateManager.LoadViewState(Object)
MethodTable 8153ed8
Module: 17f1a8
mdToken: 06000eb7 (c:\winnt_1\assembly\gac\system.web\1.0.5000.0__b03f5f7f11d50a3a\system.web.dll)
Flags : 405
IL RVA : 00000000
0:010> !dumpmd 807b778
Method Name : [DEFAULT] [hasThis] Void CustomComponents.Custom.LoadViewState(Object)
MethodTable 807b7c4
Module: 1c4198
mdToken: 06000021 (c:\winnt_1\microsoft.net\framework\v1.1.4322\temporary asp.net files\viewstatetest\08d00385\afe4cae1\assembly\dl2\76a83f92\304f7da9_925fc701\viewstatetest.dll)
Flags : 0
IL RVA : 00002804
我的理解是Method VA是属于Ngened代码,而IL RVA是属于Jitted代码,因此需要采用另外的设置断点的方法
    (1) 查找MethodDesc:
    (2) 在该MethodDesc的m_CodeOrIL域(MethodDesc的地址加4)上设置一个内存断点:

         例: ba w4 975070+0x04 "bp poi(975070+0x04);g"

    上面的断点的意思是在m_CodeOrIL被改变后在m_CodeOrIL中存储的地址上设置代码断点并继续执行。 参考文章在托管代码中设置断点(WINDBG)

但我却没有成功,总是显示

Unable to insert breakpoint 1 at c0000000, Win32 error 998
    "内存分配访问无效。"
The breakpoint was set with BP.  If you want breakpoints
to track module load/unload state you must use BU. 

不知道怎么回事.

 

 

 

 

posted @ 2007-03-06 14:00 BAsil 阅读(3046) | 评论 (2)编辑