On 23.06.22 11:41, Paul King wrote:
I tend to agree with you but it does get a little tricky. If "my own
user code" is making use of e.g. Java collection classes, then
sometimes I'd really like to see "one level down".

one level down... well, for you in

[...]
Caught: java.lang.NullPointerException
java.lang.NullPointerException
         at java.util.Hashtable.containsKey(Hashtable.java:336)
         at java.util.Hashtable$KeySet.contains(Hashtable.java:654)
         at 
java.util.Collections$SynchronizedCollection.contains(Collections.java:2023)
         at java.util.ArrayList.batchRemove(ArrayList.java:726)
         at java.util.ArrayList.removeAll(ArrayList.java:696)
         at Script.run(Script.groovy:9)

it is the removeAll, so one level down means for you one level down from
the caller (skipping indy code) - which is somewhere in the "middle" of
the trace if not sanitized in this example.

Could we make the sanitizer more intelligent to recognize the caller
(Script.groovy:9) and the method called (ArrayList#removeAll) to then
sanitize the rest in a more aggressive way?

I think actually that is maybe thought a bit too short... there can be
multiple such places, that you want to retain. Then we would have to
recognize user code vs non-user code, which is what the sanitization is
kind of about...

How about doing something like this:
* have a "hard sanitizer" list, consisting of packages/classes, that
will be always removed. like "sun." or GroovyStarter
* have a "soft sanitizer" list, consisting of packages that will be
removed only under condition
* in a first iteration we remove the frames with the hard sanitizer, in
a second iteration we remove all frames with the soft sanitizer if the
frame two frames ago has been removed. Going with the full trace from
before the expected result would then be:
* two frames ago is true if the frame is the top frame, or the first
frame in the list as well of course

java.lang.NullPointerException
        at java.util.Hashtable.containsKey(Hashtable.java:336)
        at 
java.util.Collections$SynchronizedCollection.contains(Collections.java:2023)
        at java.util.ArrayList.removeAll(ArrayList.java:696)
        at Script.run(Script.groovy:9)

hard list: org.codehaus.groovy.tools.GroovyStarter, java.lang.reflect.,
sun., org.codehaus.groovy.vmplugin

soft list:
java., groovy.

I would actually also always keep the last frame, which in this case
just be chance is true, meaning the trace above has only 1 unwanted
frame for me.

Maybe somebody else has a better idea

bye Jochen

Reply via email to