lis*_*sak 4 java exception-handling stack-trace
是否有可能做到这一点 ?
问题是,巨大的应用程序有大量的servlet过滤器.并且关于http请求抛出的每个异常包含250行,其中160个来自catalina/tomcat堆栈,这绝对不重要.
并且具有250行长堆栈迹线是非常难以使用的.
是的,可以操纵堆栈跟踪.如上所述,这取决于你想要(并且可以)攻击问题的位置.
举个例子:
对于我为我们的项目实现的远程方法调用协议,在异常情况下我们在目标端捕获它,切断下面的一些StackTraceElements(总是相同的,直到用反射实际调用目标方法) ),并将具有堆栈跟踪重要部分的异常发送给调用方.
在那里,我用它的(发送的)堆栈跟踪重建异常,然后将它与当前的堆栈跟踪合并.为此,我们还删除了当前堆栈跟踪的顶部一些元素(仅包含远程调用框架的调用):
private void mergeStackTraces(Throwable error)
{
StackTraceElement[] currentStack =
new Throwable().getStackTrace();
int currentStackLimit = 4; // TODO: raussuchen
// We simply cut off the top 4 elements, which is just
// right for our framework. A more stable solution
// would be to filter by class name or such.
StackTraceElement[] oldStack =
error.getStackTrace();
StackTraceElement[] zusammen =
new StackTraceElement[currentStack.length - currentStackLimit +
oldStack.length + 1];
System.arraycopy(oldStack, 0, zusammen, 0, oldStack.length);
zusammen[oldStack.length] =
new StackTraceElement("??????????????????????????",
"<remote call %" +callID+ ">",
"", -3);
System.arraycopy(currentStack, currentStackLimit,
zusammen, oldStack.length+1,
currentStack.length - currentStackLimit);
error.setStackTrace(zusammen);
}
Run Code Online (Sandbox Code Playgroud)
例如,这会打印出这样的痕迹:
java.lang.SecurityException: The user example does not exist
at de.fencing_game.db.userdb.Db4oUserDB.login(Db4oUserDB.java:306)
at de.fencing_game.server.impl.StandardServers$SSServer$1.run(StandardServers.java:316)
at de.fencing_game.server.impl.StandardServers$SSServer$1.run(StandardServers.java:314)
at java.security.AccessController.doPrivileged(Native Method)
at de.fencing_game.server.impl.StandardServers$SSServer.login(StandardServers.java:313)
at de.fencing_game.transport.server.ServerTransport$ConnectionInfo$4.login(ServerTransport.java:460)
at ??????????????????????????.<remote call %2>()
at $Proxy1.login(Unknown Source)
at de.fencing_game.gui.basics.LoginUtils.login(LoginUtils.java:80)
at de.fencing_game.gui.Lobby.connectTo(Lobby.java:302)
at de.fencing_game.gui.Lobby$20.run(Lobby.java:849)
Run Code Online (Sandbox Code Playgroud)
当然,对于您的情况,您最好简单地遍历数组,将重要元素复制到列表中,然后将其设置为新的stackTrace.确保为原因(即链接的throwables)执行此操作.
您可以在异常的构造函数中执行此操作,也可以在打印堆栈跟踪的位置执行此操作,或者在您捕获,操作和重新抛出异常的位置之间执行此操作.
| 归档时间: |
|
| 查看次数: |
3294 次 |
| 最近记录: |