Difference between revisions of "ZH/Case-Study-01-Journal-33"
From ADempiere
This Wiki is read-only for reference purposes to avoid broken links.
(Create new wiki for debug) |
(→背景说明) |
||
(9 intermediate revisions by the same user not shown) | |||
Line 7: | Line 7: | ||
==背景说明== | ==背景说明== | ||
* ADempiere还存在一些Bug。当某些Bug影响到正常使用时,自己就得亲自解决了。 | * ADempiere还存在一些Bug。当某些Bug影响到正常使用时,自己就得亲自解决了。 | ||
+ | * 本文主要关注较为复杂的Bug调试。对于简单的报错或Bug处理,见[[ZH/Case-Study-01-Journal-34|实施日志-34-报错或Bug简易处理]]。 | ||
− | ==2010-01-20= | + | ==2010-01-20-报错-SessionUser <> ContextUser== |
+ | * 01月17日下午有职员报告 B/S 浏览器端无法录入,检查发现报错。 | ||
+ | <pre> | ||
+ | >>org.adempiere.webui.exception.ApplicationException: Timestamp=Mon Jan 17 16:33:18 PST 2011, Bug 2832968 SessionUser=1000013, ContextUser=1000016. Please report conditions to your system administrator or in sf tracker 2832968 | ||
+ | </pre> | ||
+ | * 把 ad_user_id = 1000006 的记录删去后,不再报错。 | ||
+ | * 01月19日通过 Business Partner 窗体 User(Contact) 页签 新增记录之后,类似报错再次出现。这个报错应该是 B/S 浏览器端操作造成的,因为后来我再次删除用户 ad_user_id = 1000061,并通过 C/S 客户端进行了新增用户等操作,类似报错没有出现。 | ||
+ | ====相关链接==== | ||
+ | * [http://sourceforge.net/tracker/index.php?func=detail&aid=2832968&group_id=176962&atid=955896 问题跟踪/Bug Track] | ||
+ | * [http://sourceforge.net/projects/adempiere/forums/forum/610548/topic/3272062 sf.net 问题讨论] | ||
+ | |||
+ | ===具体影响=== | ||
+ | * 以下描述的问题是用 SuperUser 用户 以 Tongji Admin 角色登录Tongji实体(Client)进行说明的。用 SuperUser 用户 以 Garden Admin 角色 登录 Garden World 实体(Client)也存在同样问题。 | ||
+ | * 而且这个错误比较奇怪的地方是还区分实体: | ||
+ | *# SuperUser 登录 Tongji 实体,My Profile 窗口显示为 Ms Liu (ad_user_id = 1000061)。 | ||
+ | *# SuperUser 登录 GardenWorld 实体,My Profile 窗口显示为 Joe Sales。 | ||
+ | *# SuperUser 登录 System 实体,My Profile 窗口正确显示为 SuperUser。 | ||
+ | ====系统环境==== | ||
+ | * ADempiere ERP 3.6.0 LTS | ||
+ | * OS: Debian/Linux Squeeze/Testing, amd64 | ||
+ | * JVM: Java(TM) SE Runtime Environment (build 1.6.0_22-b04) 64-Bit | ||
+ | * PostgreSQL: 8.4 | ||
+ | |||
+ | ====B/S 浏览器端==== | ||
+ | * 试图打开窗体时弹出报错提示框,无法打开任何窗体。 截图如下: | ||
+ | [[Image:Bug_2832968_SessionUser_ContextUser_03.png]] | ||
+ | * 报错代码如下: | ||
+ | <pre> | ||
+ | 11:48:40,877 ERROR [STDERR] -----------> MIssue.set_ValueNoCheck: ReleaseNo - Value too long - truncated to length=4 [15] | ||
+ | 11:48:40,877 ERROR [STDERR] -----------> MIssue.set_ValueNoCheck: ReleaseNo - Value too long - truncated to length=4 [15] | ||
+ | 11:48:40,923 ERROR [STDERR] ===========> AbstractADWindowPanel.initPanel: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 [15] | ||
+ | org.adempiere.webui.exception.ApplicationException: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 | ||
+ | at org.adempiere.webui.panel.AbstractADWindowPanel.initPanel(AbstractADWindowPanel.java:274) | ||
+ | at org.adempiere.webui.panel.ADWindowPanel.initPanel(ADWindowPanel.java:218) | ||
+ | at org.adempiere.webui.window.ADWindow.doCreatePart(ADWindow.java:79) | ||
+ | at org.adempiere.webui.part.AbstractUIPart.createPart(AbstractUIPart.java:41) | ||
+ | at org.adempiere.webui.desktop.TabbedDesktop.openWindow(TabbedDesktop.java:113) | ||
+ | at org.adempiere.webui.desktop.AbstractDesktop.onMenuSelected(AbstractDesktop.java:66) | ||
+ | at org.adempiere.webui.panel.MenuPanel.fireMenuSelectedEvent(MenuPanel.java:236) | ||
+ | at org.adempiere.webui.panel.MenuPanel.onEvent(MenuPanel.java:208) | ||
+ | at org.zkoss.zk.ui.impl.EventProcessor.process0(EventProcessor.java:197) | ||
+ | at org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:141) | ||
+ | at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:519) | ||
+ | at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.run(EventProcessingThreadImpl.java:446) | ||
+ | 11:48:40,924 ERROR [STDERR] ===========> zkoss.handleError:1130: >>org.adempiere.webui.exception.ApplicationException: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 | ||
+ | >>org.adempiere.webui.exception.ApplicationException: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 | ||
+ | >> at org.adempiere.webui.panel.AbstractADWindowPanel.initPanel(AbstractADWindowPanel.java:274) | ||
+ | >> at org.adempiere.webui.panel.ADWindowPanel.initPanel(ADWindowPanel.java:218) | ||
+ | >> at org.adempiere.webui.window.ADWindow.doCreatePart(ADWindow.java:79) | ||
+ | >> at org.adempiere.webui.part.AbstractUIPart.createPart(AbstractUIPart.java:41) | ||
+ | >> at org.adempiere.webui.desktop.TabbedDesktop.openWindow(TabbedDesktop.java:113) | ||
+ | >>... [19] | ||
+ | </pre> | ||
+ | |||
+ | * 浏览器右上角显示用户 Ms Liu,并非当前用户 SuperUser。 | ||
+ | ====C/S 客户端==== | ||
+ | * 以SuperUser登录实体。 | ||
+ | * 打开My Profile窗体,显示的不是当前的登录的用户,而是Ms Liu。截图如下: | ||
+ | [[Image:Bug_2832968_SessionUser_ContextUser_02.png]] | ||
+ | * 首先通过 User 窗体、Purchase Order等窗体新增记录。接着打开数据库,在表格 ad_user 和 c_order 的新建记录中,CreatedBy 和 UpdatedBy 字段均记录为 Ms Liu (ad_user_id=1000061),而不是当前用户 SuperUser (ad_user_id=100)。截图如下: | ||
+ | [[Image:Bug_2832968_SessionUser_ContextUser_01.png]] | ||
+ | |||
+ | ===具体调试-Debug=== | ||
+ | ====对比代码==== | ||
+ | * 根据 Heng Sin 的 Tracker 上的修改记录,集中在以下类: | ||
+ | *# zkwebui/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java | ||
+ | *# zkwebui/WEB-INF/src/org/adempiere/webui/dashboard/DashboardRunnable.java | ||
+ | *# zkwebui/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java | ||
+ | * 针对这三个类,我对比了 trunk 与 360LTS 的代码,代码是相同的。 | ||
+ | * 我猜测 Heng Sin 可能只更新了343的代码,于是又对比了 343 与 360LTS 的相关代码,但是看起来 360LTS 的代码更完善一些。 | ||
+ | * 于是只好先到这里,再想想其他办法。 | ||
+ | ====跟踪#AD_User_ID==== | ||
+ | * 通过菜单 Tools --> Preference --> Context,看到 #AD_User_ID == 1000061 。 | ||
+ | * 根据 aoslee 的建议,重点查看 #AD_User_ID 为何会变错。 | ||
+ | * 于是对 org/compiere/util/Env.java 的 getAD_User_ID() 方法设置断点: | ||
+ | <pre> | ||
+ | public static int getAD_User_ID (Properties ctx) | ||
+ | { | ||
+ | return Env.getContextAsInt(ctx, "#AD_User_ID"); | ||
+ | } // getAD_User_ID | ||
+ | </pre> | ||
+ | * 一直跟踪到 getContext(Properties, String)方法: | ||
+ | <pre> | ||
+ | public static String getContext (Properties ctx, String context) | ||
+ | { | ||
+ | if (ctx == null || context == null) | ||
+ | throw new IllegalArgumentException ("Require Context"); | ||
+ | for (int i = 0; i < array.length; i++) { | ||
+ | return ctx.getProperty(context, ""); | ||
+ | } | ||
+ | } // getContext | ||
+ | </pre> | ||
+ | * 到了 return ctx.getProperty(context, ""); 这一行,就报告 Source not found,指向 java.util.Properties.getProperty(String, String) line: 951。 | ||
+ | * 接下来怎么查呢?是否要进一步看java.util.Properties.getProperty的代码? | ||
+ | |||
+ | ===讨论栏=== | ||
+ | * 欢迎您在此讨论 ... ... | ||
+ | ====一楼-看看#AD_User_ID为何会变错吧==== | ||
+ | * 感觉好像是添加(编辑)用户以后变更了用户间的关联。 | ||
+ | * 应该不是session的问题,session如果出问题,很快就会证明,当时我这里的代码页头痛了很久。现在session这块的代码你可以放心使用,应该是没有问题的。 | ||
+ | * 查查用户的变更过程,以及关联过程,看看能不能看出什么异常,重点看看为什么superuser变成了ms liu这个非常重要,也许就是解决问题的切入点 | ||
+ | * 是不是my profile显示的问题? | ||
+ | * 看看#AD_User_ID这个变量,可能是他引起的问题 | ||
+ | * po应该是调用#AD_User_ID作为createdby ,updatedby的值 | ||
+ | * 是#AD_User_ID引起的,#AD_User_ID本身指向MsLiu | ||
+ | * 看看#AD_User_ID为何会变错吧,这个就是问题的结症了 | ||
+ | |||
+ | -- aoslee 2011-01-21 | ||
+ | ====二楼-Hengsin==== | ||
+ | * please check whether this help - http://kenai.com/projects/hengsin/sources/development/revision/6655 | ||
+ | * try deploy webui as independent war, running isolated from the other legacy adempiere web application ( web store, scheduler, admin, etc ). | ||
+ | [[User:Hengsin|Hengsin]] 15:22, 21 January 2011 (UTC) | ||
+ | |||
+ | ====三楼-aoslee==== | ||
+ | * debug这种调试很难看出问题的 | ||
+ | * 在getContext函数中,增加是否是#AD_User_ID的判断,然后增加类似如下的话: | ||
+ | |||
+ | logger.warning("sessiontrace:execinit:"+Thread.currentThread()); | ||
+ | * 这样会在控制台输出信息,当然也可以输出调用队列,输出什么信息你自己看着来吧。这是以前我写的一个判断,你可以参照一下 | ||
+ | <pre> | ||
+ | UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference(); | ||
+ | if(!userPreference.getProperty(UserPreference.P_ORG).equals(Env.getAD_Org_ID(ctx)+"")) | ||
+ | { | ||
+ | logger.warning("sessionorg:"+userPreference.getProperty(UserPreference.P_ORG)+":"+(new Timestamp(System.currentTimeMillis())) | ||
+ | +":"+Env.getContext(ctx, "#WSESSIONID")+((HttpSession)currSess.getNativeSession()).getId()); | ||
+ | throw new ApplicationException("Env org is error!"); | ||
+ | } | ||
+ | </pre> | ||
+ | * Low Heng Sin的建议很重要。就是不要用posterita 以及 webstore和web版一起用,可能会引起环境变量冲突。 | ||
+ | |||
+ | -- aoslee 2011-02-22 | ||
=链接= | =链接= | ||
= About this page = | = About this page = | ||
− | * This page is about | + | * This page is about debug in ADempiere in Case Study 01, focusing on the complicated cases. |
+ | * For the simple cases, please refer to [[ZH/Case-Study-01-Journal-34|Error & Bug - Simple Cases]] | ||
[[Category:Chinese]] | [[Category:Chinese]] |
Latest revision as of 20:15, 4 March 2011
Contents
实施日志-33-Bug调试
- 本文属于机械装备制造业进销存实施案例——ADempiere ERP案例研究之一。
- 本文记录ADempiere ERP项目实施的过程
背景说明
- ADempiere还存在一些Bug。当某些Bug影响到正常使用时,自己就得亲自解决了。
- 本文主要关注较为复杂的Bug调试。对于简单的报错或Bug处理,见实施日志-34-报错或Bug简易处理。
2010-01-20-报错-SessionUser <> ContextUser
- 01月17日下午有职员报告 B/S 浏览器端无法录入,检查发现报错。
>>org.adempiere.webui.exception.ApplicationException: Timestamp=Mon Jan 17 16:33:18 PST 2011, Bug 2832968 SessionUser=1000013, ContextUser=1000016. Please report conditions to your system administrator or in sf tracker 2832968
- 把 ad_user_id = 1000006 的记录删去后,不再报错。
- 01月19日通过 Business Partner 窗体 User(Contact) 页签 新增记录之后,类似报错再次出现。这个报错应该是 B/S 浏览器端操作造成的,因为后来我再次删除用户 ad_user_id = 1000061,并通过 C/S 客户端进行了新增用户等操作,类似报错没有出现。
相关链接
具体影响
- 以下描述的问题是用 SuperUser 用户 以 Tongji Admin 角色登录Tongji实体(Client)进行说明的。用 SuperUser 用户 以 Garden Admin 角色 登录 Garden World 实体(Client)也存在同样问题。
- 而且这个错误比较奇怪的地方是还区分实体:
- SuperUser 登录 Tongji 实体,My Profile 窗口显示为 Ms Liu (ad_user_id = 1000061)。
- SuperUser 登录 GardenWorld 实体,My Profile 窗口显示为 Joe Sales。
- SuperUser 登录 System 实体,My Profile 窗口正确显示为 SuperUser。
系统环境
- ADempiere ERP 3.6.0 LTS
- OS: Debian/Linux Squeeze/Testing, amd64
- JVM: Java(TM) SE Runtime Environment (build 1.6.0_22-b04) 64-Bit
- PostgreSQL: 8.4
B/S 浏览器端
- 试图打开窗体时弹出报错提示框,无法打开任何窗体。 截图如下:
- 报错代码如下:
11:48:40,877 ERROR [STDERR] -----------> MIssue.set_ValueNoCheck: ReleaseNo - Value too long - truncated to length=4 [15] 11:48:40,877 ERROR [STDERR] -----------> MIssue.set_ValueNoCheck: ReleaseNo - Value too long - truncated to length=4 [15] 11:48:40,923 ERROR [STDERR] ===========> AbstractADWindowPanel.initPanel: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 [15] org.adempiere.webui.exception.ApplicationException: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 at org.adempiere.webui.panel.AbstractADWindowPanel.initPanel(AbstractADWindowPanel.java:274) at org.adempiere.webui.panel.ADWindowPanel.initPanel(ADWindowPanel.java:218) at org.adempiere.webui.window.ADWindow.doCreatePart(ADWindow.java:79) at org.adempiere.webui.part.AbstractUIPart.createPart(AbstractUIPart.java:41) at org.adempiere.webui.desktop.TabbedDesktop.openWindow(TabbedDesktop.java:113) at org.adempiere.webui.desktop.AbstractDesktop.onMenuSelected(AbstractDesktop.java:66) at org.adempiere.webui.panel.MenuPanel.fireMenuSelectedEvent(MenuPanel.java:236) at org.adempiere.webui.panel.MenuPanel.onEvent(MenuPanel.java:208) at org.zkoss.zk.ui.impl.EventProcessor.process0(EventProcessor.java:197) at org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:141) at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:519) at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.run(EventProcessingThreadImpl.java:446) 11:48:40,924 ERROR [STDERR] ===========> zkoss.handleError:1130: >>org.adempiere.webui.exception.ApplicationException: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 >>org.adempiere.webui.exception.ApplicationException: Timestamp=Wed Jan 19 11:48:40 PST 2011, Bug 2832968 SessionUser=100, ContextUser=1000061. Please report conditions to your system administrator or in sf tracker 2832968 >> at org.adempiere.webui.panel.AbstractADWindowPanel.initPanel(AbstractADWindowPanel.java:274) >> at org.adempiere.webui.panel.ADWindowPanel.initPanel(ADWindowPanel.java:218) >> at org.adempiere.webui.window.ADWindow.doCreatePart(ADWindow.java:79) >> at org.adempiere.webui.part.AbstractUIPart.createPart(AbstractUIPart.java:41) >> at org.adempiere.webui.desktop.TabbedDesktop.openWindow(TabbedDesktop.java:113) >>... [19]
- 浏览器右上角显示用户 Ms Liu,并非当前用户 SuperUser。
C/S 客户端
- 以SuperUser登录实体。
- 打开My Profile窗体,显示的不是当前的登录的用户,而是Ms Liu。截图如下:
- 首先通过 User 窗体、Purchase Order等窗体新增记录。接着打开数据库,在表格 ad_user 和 c_order 的新建记录中,CreatedBy 和 UpdatedBy 字段均记录为 Ms Liu (ad_user_id=1000061),而不是当前用户 SuperUser (ad_user_id=100)。截图如下:
具体调试-Debug
对比代码
- 根据 Heng Sin 的 Tracker 上的修改记录,集中在以下类:
- zkwebui/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java
- zkwebui/WEB-INF/src/org/adempiere/webui/dashboard/DashboardRunnable.java
- zkwebui/WEB-INF/src/org/adempiere/webui/session/SessionContextListener.java
- 针对这三个类,我对比了 trunk 与 360LTS 的代码,代码是相同的。
- 我猜测 Heng Sin 可能只更新了343的代码,于是又对比了 343 与 360LTS 的相关代码,但是看起来 360LTS 的代码更完善一些。
- 于是只好先到这里,再想想其他办法。
跟踪#AD_User_ID
- 通过菜单 Tools --> Preference --> Context,看到 #AD_User_ID == 1000061 。
- 根据 aoslee 的建议,重点查看 #AD_User_ID 为何会变错。
- 于是对 org/compiere/util/Env.java 的 getAD_User_ID() 方法设置断点:
public static int getAD_User_ID (Properties ctx) { return Env.getContextAsInt(ctx, "#AD_User_ID"); } // getAD_User_ID
- 一直跟踪到 getContext(Properties, String)方法:
public static String getContext (Properties ctx, String context) { if (ctx == null || context == null) throw new IllegalArgumentException ("Require Context"); for (int i = 0; i < array.length; i++) { return ctx.getProperty(context, ""); } } // getContext
- 到了 return ctx.getProperty(context, ""); 这一行,就报告 Source not found,指向 java.util.Properties.getProperty(String, String) line: 951。
- 接下来怎么查呢?是否要进一步看java.util.Properties.getProperty的代码?
讨论栏
- 欢迎您在此讨论 ... ...
一楼-看看#AD_User_ID为何会变错吧
- 感觉好像是添加(编辑)用户以后变更了用户间的关联。
- 应该不是session的问题,session如果出问题,很快就会证明,当时我这里的代码页头痛了很久。现在session这块的代码你可以放心使用,应该是没有问题的。
- 查查用户的变更过程,以及关联过程,看看能不能看出什么异常,重点看看为什么superuser变成了ms liu这个非常重要,也许就是解决问题的切入点
- 是不是my profile显示的问题?
- 看看#AD_User_ID这个变量,可能是他引起的问题
- po应该是调用#AD_User_ID作为createdby ,updatedby的值
- 是#AD_User_ID引起的,#AD_User_ID本身指向MsLiu
- 看看#AD_User_ID为何会变错吧,这个就是问题的结症了
-- aoslee 2011-01-21
二楼-Hengsin
- please check whether this help - http://kenai.com/projects/hengsin/sources/development/revision/6655
- try deploy webui as independent war, running isolated from the other legacy adempiere web application ( web store, scheduler, admin, etc ).
Hengsin 15:22, 21 January 2011 (UTC)
三楼-aoslee
- debug这种调试很难看出问题的
- 在getContext函数中,增加是否是#AD_User_ID的判断,然后增加类似如下的话:
logger.warning("sessiontrace:execinit:"+Thread.currentThread());
- 这样会在控制台输出信息,当然也可以输出调用队列,输出什么信息你自己看着来吧。这是以前我写的一个判断,你可以参照一下
UserPreference userPreference = SessionManager.getSessionApplication().getUserPreference(); if(!userPreference.getProperty(UserPreference.P_ORG).equals(Env.getAD_Org_ID(ctx)+"")) { logger.warning("sessionorg:"+userPreference.getProperty(UserPreference.P_ORG)+":"+(new Timestamp(System.currentTimeMillis())) +":"+Env.getContext(ctx, "#WSESSIONID")+((HttpSession)currSess.getNativeSession()).getId()); throw new ApplicationException("Env org is error!"); }
- Low Heng Sin的建议很重要。就是不要用posterita 以及 webstore和web版一起用,可能会引起环境变量冲突。
-- aoslee 2011-02-22
链接
About this page
- This page is about debug in ADempiere in Case Study 01, focusing on the complicated cases.
- For the simple cases, please refer to Error & Bug - Simple Cases