Skip to content

Commit c989b32

Browse files
committed
abbreviate package names
1 parent d42fd0a commit c989b32

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

javalib/agent-tests/src/test/java/stackparam/ThrowableTest.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ public class ThrowableTest {
99

1010
@Test
1111
public void testStackTraceElementToString() throws Exception {
12-
String expected = "[this=" + this + ", boolArg=true, byteArg=100, " +
12+
String expected = "[this=" + this.toString().replace("stackparam.", "s.") +
13+
", boolArg=true, byteArg=100, " +
1314
"charArg=e, shortArg=102, intArg=103, longArg=104, " +
1415
"floatArg=105.6, doubleArg=106.7, nullArg=null, " +
15-
"objectExactArg=" + CONST_OBJ + ", stringVarArgs=[foo, bar, baz]]";
16+
"objectExactArg=" + CONST_OBJ.toString().replace("java.lang", "j.l") +
17+
", stringVarArgs=[foo, bar, baz]]";
1618
StackTraceElement elem = getTestElement();
1719
String traceStr = elem.toString();
1820
traceStr = traceStr.substring(traceStr.indexOf('['));

javalib/native/src/main/java/stackparam/StackParamNative.java

+35-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package stackparam;
22

33
import java.util.Arrays;
4+
import java.lang.reflect.Method;
45

56
public class StackParamNative {
67

@@ -10,6 +11,15 @@ public class StackParamNative {
1011
*/
1112
public static int MAX_PARAM_STR_LEN = 50;
1213

14+
public static Method DEFAULT_TO_STRING;
15+
static {
16+
try {
17+
DEFAULT_TO_STRING = Object.class.getMethod("toString");
18+
} catch (Exception e) {
19+
//can't happen
20+
}
21+
}
22+
1323
/**
1424
* Returns the stack params of the given thread for the given depth. It is
1525
* returned with closest depth first.
@@ -60,14 +70,18 @@ public static String appendParamsToFrameString(String frameString, Object[] para
6070
if (param.length() <= MAX_PARAM_STR_LEN) ret.append(param);
6171
else ret.append(param, 0, MAX_PARAM_STR_LEN).append("...");
6272
}
63-
return ret.append("]").toString();
73+
return ret.append("]").toString().replace("\n", "\\n");
6474
} catch (Exception e) {
6575
return frameString + "[failed getting params: " + e + "]";
6676
}
6777
}
6878

6979
private static String paramValToString(Object paramVal) {
70-
if (paramVal != null && paramVal.getClass().isArray()) {
80+
if (paramVal == null) {
81+
return "null";
82+
}
83+
84+
if (paramVal.getClass().isArray()) {
7185
if (paramVal instanceof boolean[]) return Arrays.toString((boolean[]) paramVal);
7286
else if (paramVal instanceof byte[]) return Arrays.toString((byte[]) paramVal);
7387
else if (paramVal instanceof char[]) return Arrays.toString((char[]) paramVal);
@@ -78,6 +92,25 @@ private static String paramValToString(Object paramVal) {
7892
else if (paramVal instanceof double[]) return Arrays.toString((double[]) paramVal);
7993
else return Arrays.toString((Object[]) paramVal);
8094
}
95+
96+
// Collapse package names to first letters when using default toString for objects
97+
try {
98+
Method toStringMethod = paramVal.getClass().getMethod("toString");
99+
if (DEFAULT_TO_STRING.equals(toStringMethod)) {
100+
String tmp = paramVal.toString();
101+
String[] split = tmp.split("\\.");
102+
StringBuilder out = new StringBuilder();
103+
for(int i=0; i<split.length - 1; i++) {
104+
String s = split[i];
105+
out.append(s.charAt(0)).append(".");
106+
}
107+
out.append(split[split.length-1]);
108+
return out.toString();
109+
}
110+
} catch(Exception e) {
111+
//all objects have toString methods, so can't happen
112+
throw new RuntimeException("Can't happen", e);
113+
}
81114
return String.valueOf(paramVal);
82115
}
83116
}

0 commit comments

Comments
 (0)