ZH/Case-Study-01-Journal-33

From ADempiere
Jump to: navigation, search
This Wiki is read-only for reference purposes to avoid broken links.

<返回中文首页> <返回本案例研究首页>

实施日志-33-Bug调试

背景说明

  • 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)也存在同样问题。
  • 而且这个错误比较奇怪的地方是还区分实体:
    1. SuperUser 登录 Tongji 实体,My Profile 窗口显示为 Ms Liu (ad_user_id = 1000061)。
    2. SuperUser 登录 GardenWorld 实体,My Profile 窗口显示为 Joe Sales。
    3. 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 浏览器端

  • 试图打开窗体时弹出报错提示框,无法打开任何窗体。 截图如下:

Bug 2832968 SessionUser ContextUser 03.png

  • 报错代码如下:
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。截图如下:

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)。截图如下:

Bug 2832968 SessionUser ContextUser 01.png

具体调试-Debug

对比代码

  • 根据 Heng Sin 的 Tracker 上的修改记录,集中在以下类:
    1. zkwebui/WEB-INF/src/org/adempiere/webui/TimelineEventFeed.java
    2. zkwebui/WEB-INF/src/org/adempiere/webui/dashboard/DashboardRunnable.java
    3. 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

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