U9调试技巧

栏目:u9cloud知识作者:用友来源:用友发布:2024-08-20浏览:1

U9调试技巧

开头:

  1. 调试之前:
    1. 查询是否通用问题.
    2. 通过LOG解决问题.(LOG扩展)
    3. 知识点:

 

  1. 调试过程:
    1. 重现BUG
    2. 描述BUG
    3. 分面治之
    4. 创造性思考 - 
    5. 利用工具
    6. 重度调试
    7. 学习和分享
      1. 基本调试选项-源文件和原始版本完全匹配

 

VS的调试相关

位置:工具栏→选项→调试

一般建议源文件和原始版本完全匹配勾上,这样调试能保证在正确的版本上进行调试,如果调试的版本不一致,有可能导致看到了错误的结果和代码。

目前,每次构造UBF发版都会有相应的代码备份提供。

--注意项目选项中的代码优化选项.

  1. 基本调试选项-异常中断选项

           在VS调试时,按下CTRL+ALT+E 可以弹出异常中断选项,

           当UBF或者开发人员的代码吃掉异常时,又不进行LOG时,用此方法,可以将Common Language Runtieme Exceptions 引发(T) 勾上。

           这样,只要代码中抛出异常,就会被VS截获,并展现出来。

           但同样,有个缺点是,任何的异常都会被展现,对于有些代码中不规范的用try..Catch方法来屏蔽错误的,也会报出来,可能会导致出现很多异常被展现。

                   

  1. 基本调试选项-附加到进程(需要勾选显示所有用户的进程)

          对于目前U9的调试,直接附加到w3wp进程就可以了;如果走工作流调试,需要附加到“UFIDA.U9.CS.Collaboration.MailService.exe”;如果后台调度执行,需要附加到“UFIDA.U9.UBF.SystemManage.ApplllicationService.exe”。

对于很多问题的解决,需要同时进入两个进程,可以同时附加两个进程(选中多个进程即可)。

          

          目前大部分情况使用单机版本,只需要附加W3WP进程即可.

          

  1. 基本调试技巧-断点的高级设置

对于一些循环次数较多,但又必须要在循环中设断点进行调试的情况,可以在断点上点右键,使用断点的命中条件,次数。。来进行设置,使断点能命中在你所需要的进行情况下。加快调试的速度。

 

  1. 基本调试技巧-查看堆栈信息

不管是从LOG文件(U9安装目录,../portal/log下)中,还是从调试的过程中,查看堆栈信息,都是解决错误的基本快速的手段。

通过在调试中,查看堆栈,了解代码的执行过程。并能够通过双击某一堆栈行,来将当前的关注点定位过去,查看当前上下文的数据。此时,很多时候,需要

 

  1. 基本调试技巧-查看内部异常信息

很多异常信息在使用VS调试的时候,只是看到外部异常对象.这个信息如果被包装的不是很正确的话,将可能造成查看的异常不明确,无法解决问题.

一般正确的捕获异常并再次抛出新异常时,都会将原有的异常对象作为新异常对象的InnerException.这样就能保留原有的错误信息和堆栈.方便找出问题的根本原因.

对于这样的异常对象,一定要找到最Inner的Exception,才会发现问题的最根本原因,最根本的堆栈.

                

  1. 中级调试技巧-对象监控ID的创建

创建对象ID是一个很好的跟踪对象变化的方式,比如实体对象,可能在一些上下文中并不能很好的监控到对象.当可以监控时,创建该对象ID,然后就可以用 1# 这样的方式在任何位置,地方.都能去观察该对象,省去了查找该对象的麻烦. 

 

  1. 中级调试技巧-异常回溯

        在异常出现后,用启用编辑,将程序回退到出现异常前一刻,然后你可以改变参数或者变量的值,来尝试改变逻辑后,能否通过…

 

  1. 改善调试速度-仅监控有调试需要的代码文件

由于目前的Portal和ApplicationServer都比较大,附加这两个进程的时候,如果你是用你当前的一个项目去附加,会使VS挂载进程和调试都比较慢。

好的办法是:当一般在你在LOG中已经发现问题所在.CS文件后,就可以直接将该文件拖到一个新打开的VS中,直接调试。不用加载该代码所在的项目。

 

U9调试环境

  1. 注意DLL匹配问题.

目前后期少见一些.注意接口变动导致.

常见的对应错误信息: 找不到***方法,在**DLL中. A-〉B

 

  1. 注意DLL的位置,避免重复DLL导致问题.
    1. 调试点 - 一个页面流程(Webpart)的三个基本方法

Ctrl+alt+U 模块窗口,可以查看加载的DLL的真实的位置,和相应的符号加载信息.

 

 

UBF运行期调试-前端

当任何一次页面加载,PostBack都会走这三个方法,对这三个方法进行调试,可以查出页面几个标准的的输入输出点是否正确,从而容易定位出问题在什么地方。

  1. OnInit () 方法

该方法中CreateFormChildControls()进行了整个页面控件的创建和初始化处理。如果页面控件的绑定等有问题,就需要查一下这里面的代码,是否生成的正确:如绑定的VIEW,FIELD.

 

  1. "margin-left:52.5pt;">页面OnInit()完后,会进入该"margin-left:31.5pt;">通过  if (UIEngineHelper.IsDataBind(PageStatus, this))

 

来判断页面是首次进入还是PostBack回来,来进行不同的逻辑。

对该方法设断点,可以了解该页面加载或者是PostBack()的,当前Model的数据是如何得到的。可以查出UIModel相关的数据问题。

 

  1. OnPreRender()方法
  2. 服务端事件的执行。
  1. 调试点 - UIPDHelper
  2. 调试点 - 通用Action代码
  3. 调试点 - 通用CRUD (服务器版要加载ApplicationServer进程)
  • 通用查询:
  • 通用保存:
  1. 调试点 - 数据库CRUD操作
  2. 调试方法-获取当前事务上下文中最新的数据值
  • UI             翻页或者列表进入卡片时,报错:
  1. ".No such field Item in UFIDA.U9.InvDoc.TransferOut.TransOutLine"
  2. 解:UIModel中的TransOutLine里拖了一个子实体里面的属性.造成拼出的OQL语句有问题,解析时出错.
  3. 规则:不允许在一对多的一方拖多方的字段,这样加载不起来,只能在N对一方,去拖一方的字段,可以进行关联加载
  4.  
  • 翻页时数据加载不出来,而正常列表导卡片均可以使用.并且没有任何错误提示.
  1. 解:注意检查运行时,当前的主容器.是不是正确,如果不正确,就要打开xml文件来手工编辑Form的,调整主容器.
  2.  
  • Couldn't find Column DescFlexSegments.GlobalSeg1 from entity UFIDA.U9.RCV.Receivement.ReceivementSubLine
  1. UIMODEL中的可能与实体中的不一致.要
  2.  
  • UI保存成功后,数据库数据已经存上,缺报没有找到相应的记录.
  1.  解:UIMODEL设置了过滤条件.但是数据在界面上录入时,没有按照指定的过滤条件的正确参数给UI赋值,导致存入数据库无法被加载起来.
  2.  
  •  
  1. 后台执行代码时出现
  2. "No Entity in metadata for class "UFIDA " "
  3. 解: 一般是由于开发人员写了下列类似的代码:
  4.  SetofBooks.Finder.Find("ID=" + transferFormCost.SOB + "");
  5. 造成了将SOB的类型全名作为参数值代入到OQL中,导致解析出错.只要本应该传数值型参数,传了字符串,都会出现这样的错误..
  6.  正确写法:
  7.  SetofBooks.Finder.Find("ID=" + transferFormCost.SOB.id + "");
  8.  或者用参数化的:
  9.   SetofBooks.Finder.Find("ID=@ID",new OqlParam("ID",transferFormCost.SOB));
  10.  
  11. 从UI传实体KEY类型数据到后台,访问实体类型属性时,缺发现属性为空。
  12. 后台代码运行中出现:
  13. 后台代码运行中出现:
  14. "已添加项。字典中的关键字:“DescFlexField”所添加的关键字:“DescFlexField”"
  15. 堆栈: 在 UFSoft.UBF.MD.MDBaseCollection.Add(IElement obj)
  16. 解: 问题是因为实体的继承后,与父类有相同的属性名.造成重复.运行时,持久化加载元数据的时候,调用相应的元数据服务时,其中将会将重复的属性添加到hash中,导致重复关键字错误..
  17. 后台代码运行中出现:
  18. 后台代码运行中出现:
  19. 后台代码运行中出现:
  20. 后台代码运行中出现:
  21. 尝试对参数 http://www.UFIDA.org 进行序列化时出错: context。InnerException 消息是“数据协定名称
  22.                                  UI调用BP或者服务时,从前台传递相应的Data数据到后台,string 型的数据传到后台丢失。其它都没丢失。
  23. 调试的心得
    1. 一些调试注意事项:
      1. 注意DLL文件的存在多份造成的错误:
  24. 注意有可能PDB文件不存在导致的断点没有命中。
  25. 常见BP调用错误解决:(特别对于组件用Nunit进行测试用例)
    1. "找不到方法: “!0 UFSoft.UBF.Service.Agent.ServiceLocator`1 GetService(UFSoft.UBF.Service.Token)”。"
  26. UFIDA.U9.CBO.MFG.Resource.CalcResourceUsageTest.TestDo : System.ServiceModel.EndpointNotFoundException : 无法连接到 http://localhost:8000/Directory/IDirectoryService。TCP 错误代码 10061: 由于目标机器积极拒绝,无法连接。。 
  27. 示例:没有终结点在侦听可以接受消息的 http://localhost:8080/Services/UFIDA.U9.InvDoc.ItemRequest.IGetDefaultDocTypeBP。这通常是由于不正确的地址或者 SOAP 操作导致的。如果存在此情况,请参阅 InnerException 以了解详细信息。
  28.  针对的UBF(20070430)版本的经常将异常吃掉情况的调试办法:
  29. 对于UI查询(包括翻页)出现的错误或者是没有能加载出数据情况:
    1. //s003b22/U9V1Trd/调试/UIModelQueryExtend.cs文件拖到VS中,并加载ServerApplication进程。
    2. 在 下列位置行号 33处 设置断点。
  30. 对于UI执行提交保存操作:
    1. //s003b22/U9V1Trd/调试/UIModelUpdateExtend.cs文件拖到VS中,并加载ServerApplication进程。
    2. 在下列位置 行号 34 处设置断点。
  31. 对于校验方面出错,但不能显示出具体原因的。
    1. //s003b22/U9V1Trd/调试/Entity.cs文件拖到VS中,并加载ServerApplication进程。
    2. 在 行号 588 处设置断点。
  32. U9调试技巧总结
  33. 往往Bug的出现是在我们作了修改之后产生,所以我们可以关注自己的变动的那部分代码,这也是大家熟知的。
  34. 熟悉流程与ASP.NET生命周期 [或者我们的Portal的],分析问题可能发生时机,或者处理业务操作的最佳时机。
  35. 重视抛出的异常堆栈[TraceStack],重视Log日志
  36. 借助于工具分析,如页面展现我们可以使用IE DOM Explorer,如性能问题我们用AQTime,试着去学,去做,对我们开发人员也是一种提升
  37. 建立知识的同享,对常见问题以及解决方案汇总,Share自己的调试经验,Share碰到问题与解决问题的过程,注重与人的交流,形成一种互帮互助[不是个别人的,这样也减轻别人的负担]
    1. U9调试经验汇总:
  38. 同一性质的数据应批量地创建(如批量创建物料),或者使用同一框架进行创建(本人使用的是CreateDefault方法),因为有很多共性,发现问题也可以统一解决。
  39. 尽量熟悉所依赖的底层逻辑(如关键弹性域等),了解业务规则,方便测试数据的快速创建。
  40. 减少调试最好的办法就是加强测试用例。
  41. 尽量少的跟踪进平台的代码中,而是将自己的Extend文件加入调试(在UBF比较稳定的阶段比较可取)
  42. 多利用堆栈和日志定位bug。(在5.8号的版本中,LOG设置成Warn级,基本上已经可以将大部分的错误在LOG上体现出来了),通过日志可以很快定位错误的根本原因。
  43. 重点跟踪绕过平台或者自行实现的方法 往往是因为平台实现机制的改变导致这部分代码失效  
  44. 每次获取最新的UBF版本后,最好将本地环境全部更新一遍,包括对所依赖的开发组件的本地重新构造,拷贝,以及脚本的执行。尽量避免频繁地更换版本(包括UBF及底层DLL)。
  45. VS2005版本以上的新增调试功能(转载)
    1. 编辑时对象识别
  46. Just My Code Debugging
  47. Exception Assistant(异常助手)
  48. Object Assistant(对象助手)
  49. Edit and Contiue功能
  50. Data Tips
      在Visual Studio 2005中,在调试方面,还新增了"data tips(数据提示)"的功能。当在调试程序期间,只需要将光标移到代码中某个需要监视的参数上,系统就会自动显示与该参数相关联的一些很有用的信息,比如相关的属性,以及当前该参数的值。在Visual Studio 2003中,也有该功能,但提供的信息比现在的2005少很多。
      我们依然以上面"edit and continue"使用的例子来说明。我们将断点设在MessageBox.Show这一行,F5运行程序,当在文本框输入文字并按确定按钮后,程序自动中断,这时,将光标移到textbox1.text这个位置,系统就会调用data tips功能,如下图所示显示出与textbox文本框控件相关的一些属性以及这些属性此时对应的值。
     
  51.      在data tip的功能中,还可以继续使用edit and continue的功能,只需要在需要的地方鼠标右键就可以弹出如下图的菜单,可以编辑该值。
       

U9调试技巧

开头:调试之前:查询是否通用问题.通过LOG解决问题.(LOG扩展)知识点: 调试过程:重现BUG描述BUG分面治之创造性思考 - 利用工具重度调试学...
点击下载文档
标签: # U9C
分享:
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息