我们系统不知道谁写的代码有点为题,使用System.err,输出了很多(接近百万条)空引用异常:
[16:17:26.836]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException显然没有打堆栈,我估计使用System.err.println(exception)的结果,因为java.lang.Throwable的 toString()方法默认就是只有getClass().getName(),但是现在的问题时我们的代码分不到很多部门,我没有权限拿到所有代码,反编译后也看不出来什么东西。哪位有没有办法能够捕捉到堆栈,或者任何发现问题代码的线索???
重定向System.err是没有用的,有没有JVM指令什么的???非常感谢
[16:17:26.836]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException显然没有打堆栈,我估计使用System.err.println(exception)的结果,因为java.lang.Throwable的 toString()方法默认就是只有getClass().getName(),但是现在的问题时我们的代码分不到很多部门,我没有权限拿到所有代码,反编译后也看不出来什么东西。哪位有没有办法能够捕捉到堆栈,或者任何发现问题代码的线索???
重定向System.err是没有用的,有没有JVM指令什么的???非常感谢
[16:17:26.836]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
那只有把系统log功能增强一下,每个用户进入系统是知道的而且保存在全局范围内,所以把用户名打倒log中
STRUTS项目配置文件: <global-exceptions>
<exception
key="errors.detail"
type="java.lang.Exception"
path="/exceptions/exception.jsp"
scope="request"
handler="com.ibm.exception.ExceptionHandler"
></exception>
</global-exceptions>
你自己写一个处理器就行了:打印出异常的message。
我需要问题在哪,然后找相关人员去修改,现在是日志在我这边,但是不知道是谁的问题,所以比较棘手。如果有堆栈就好办了,可是现在没有。---------------------------------------------我们有log4j,但是显然有很多的代码还是使用的System.out和System.err,问题是重定向了System.err也不能得到堆栈。
使用的是struts 1.x,但是显然某人捕捉了此异常,并没有抛出,而且调用了System.err,所以才会有输出而没有堆栈。异常处理器不能捕捉到已经处理过而没有抛出的异常。
I call! 这个难了,JVM处理异常代码是透明的。况且JVM我也没研究过。不过异常那么多,应该是集合操作。你可以试验一下反射,将工程包下的类一概反向测试一遍----但是如果空指针有输入随机性,那你找神仙解决吧!
LOG太不详细了根据前面的时间猜猜
在Eclipse中:菜单栏中的Run->Add Java Exception Breakpoint...->然后添加NullPointException.
然后debug,程序就会在发生异常的地方停下来。
我们的服务只能跑在centerOS上,因为依赖的中间层、数据库都只认服务器的IP,本机的IP是无法连接上的,而centerOS没有GUI,无法开eclipse.对于远程调试基本不可用,因为太快了,一下子就搞死了。有没有其它方法???或者命令行运行暂停??
try{
}catch(Exception e){
e.printStackTrace(System.err);
}
但是,好像即使不这样写,系统也能自动把堆栈打出来吧???
为什么这么写就不知道了,人多了,什么“*”都有,所以只能追求现在解决问题,我也希望推广不准使用System.err和System.out,但是大家也知道,这东西不是我们说推就能推的,很多时候都是一种无奈。
另外:exception.printStackTrace() <==> exception.printStackTrace(System.err)
要不行,你将e.printStackTrace(System.err);中的System.err换成另外的文件流。看看能不能写到文件里。
Eclipse的调试功能能够捕捉到catched和uncatched的异常,我想问下能不能用什么方法模拟这样的调试过程,我捕捉到异常但是又不挂起JVM同时还能够得到当前上下文的堆栈???有没有类似的工具?
[16:17:26.908]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
[16:17:26.908]java.lang.NullPointerException
光有这些东西,你让 CSDN 的人来帮你找问题在哪?
import java.io.PrintStream;public class Test6 {
static {
System.setErr(new MyPrintStream(System.err));
}
public static void main(String[] args) {
try {
String s = null;
System.out.println(s.length());
}catch(Exception e) {
System.err.println(e);
}
}
}class MyPrintStream extends PrintStream { public MyPrintStream(OutputStream out) {
super(out);
} @Override
public void println(Object x) {
if(x instanceof Throwable) {
Throwable t = (Throwable)x;
StackTraceElement[] stes = t.getStackTrace();
super.println(t + " " + stes[0].toString());
return;
}
super.println(x);
}
}你可以写个 Servlet 的 init 中写上 System.setErr(new MyPrintStream(System.err));
在服务启动执行
我看了一下,你那个空指针记录的最前面都是时间点。
你先吧Log4j的日志格式改成我们调试时候的那个格式。
就是,即带时间点,又有代码的行号,系统效率最低的那种格式。
然后,根据两种日志的时间点,大致先吧问题定位到某几个(3~5)类上面。
然后,在根据实际的业务逻辑,进行排除。
估计应该是线程同步没有处理好的缘故。
精确定位的时候,可以通过添加切入点的方式来确定到某个方法当中。
我也只能想到这么多了。
总之,解决起来是比较麻烦的。
(替别人擦屁股嘛,总是让人痛苦而又恶心滴)慢慢来吧。
要找错误的话,先一个一个页面的去测试,看看打异常时是跳转到了哪个页面时发生的。大概定位一下哪个功能模块出问题还有,不要光看你们自己log4j出的Log,看看web服务器的Log,或许会有更详细的错误提示
<exception
key="errors.detail"
type="java.lang.Exception"
path="/exceptions/exception.jsp"
scope="request"
handler="com.ibm.exception.ExceptionHandler"
> </exception>
</global-exceptions>
你自己写一个处理器就行了:打印出异常的message。
{
代码
}catch(NullPointerException se)
{
进行处理
}
不过对于比较大的项目,JPF恐怕也心有余而力不足了。