classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: regression in logger?


From: Mark Wielaard
Subject: Re: regression in logger?
Date: Fri, 15 Jul 2005 14:52:44 +0200

Hi,

On Mon, 2005-07-11 at 07:54 -0400, David P Grove wrote:
> This started showing up in regression tests of Jikes RVM with classpath 
> cvs head recently.  I haven't dug deeply, so it could be a latent problem 
> in Jikes RVM that was exposed by a classpath change, rather than a real 
> classpath bug, but might still be worth mentioning.  The failing program 
> is SPECjbb2000.

Unfortunately I don't have a current Jikes RVM setup to test against.
But I will include this workaround to make the code more robust against
StackTraceElement[] that are not like it expects (note that
Throwable.getStackTraceElements() may not contain all frames in general,
so it isn't a very robust way to walk the stack.)

2005-07-15  Mark Wielaard  <address@hidden>

       * java/util/logging/Logger.java (getCallerStackFrame):
       Make sure index < stackTrace.length and return null otherwise.
       (log): Check for caller == null.

Note that this getCallerStackFrame() method is highly inefficient and
should really use direct runtime support through the VMStackWalker
methods.

Cheers,

Mark

P.S. Hopefully the last patch before 0.17. Please coordinate on
irc.gnu.org #classpath if you want some last minute fix in.
Index: java/util/logging/Logger.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/util/logging/Logger.java,v
retrieving revision 1.10
diff -u -r1.10 Logger.java
--- java/util/logging/Logger.java       14 Jul 2005 13:16:58 -0000      1.10
+++ java/util/logging/Logger.java       15 Jul 2005 12:51:12 -0000
@@ -585,10 +585,10 @@
                               String message,
                               Object param)
   {
-       StackTraceElement caller = getCallerStackFrame();
+    StackTraceElement caller = getCallerStackFrame();
     logp(level,
-        caller.getClassName(),
-        caller.getMethodName(),
+        caller != null ? caller.getClassName() : "<unknown>",
+        caller != null ? caller.getMethodName() : "<unknown>",
         message,
         param);
   }
@@ -600,8 +600,8 @@
   {
     StackTraceElement caller = getCallerStackFrame();
     logp(level,
-        caller.getClassName(),
-        caller.getMethodName(),
+        caller != null ? caller.getClassName() : "<unknown>",
+        caller != null ? caller.getMethodName() : "<unknown>",
         message,
         params);
   }
@@ -611,10 +611,10 @@
                               String message,
                               Throwable thrown)
   {
-       StackTraceElement caller = getCallerStackFrame();    
+    StackTraceElement caller = getCallerStackFrame();    
     logp(level,
-        caller.getClassName(),
-        caller.getMethodName(),
+        caller != null ? caller.getClassName() : "<unknown>",
+        caller != null ? caller.getMethodName() : "<unknown>",
         message,
         thrown);
   }
@@ -1162,19 +1162,25 @@
   /**
    * Gets the StackTraceElement of the first class that is not this class.
    * That should be the initial caller of a logging method.
-   * @return caller of the initial looging method
+   * @return caller of the initial logging method or null if unknown.
    */
   private StackTraceElement getCallerStackFrame()
   {
     Throwable t = new Throwable();
     StackTraceElement[] stackTrace = t.getStackTrace();
     int index = 0;
+
     // skip to stackentries until this class
-    
while(!stackTrace[index].getClassName().equals(getClass().getName())){index++;}
+    while(index < stackTrace.length
+         && !stackTrace[index].getClassName().equals(getClass().getName()))
+      index++;
+
     // skip the stackentries of this class
-    
while(stackTrace[index].getClassName().equals(getClass().getName())){index++;}
+    while(index < stackTrace.length
+         && stackTrace[index].getClassName().equals(getClass().getName()))
+      index++;
 
-    return stackTrace[index];
+    return index < stackTrace.length ? stackTrace[index] : null;
   }
   
   /**

Attachment: signature.asc
Description: This is a digitally signed message part


reply via email to

[Prev in Thread] Current Thread [Next in Thread]