我需要编写一个小的日志分析器应用程序来处理由我的项目中使用的第三方闭源库(在里面有自定义记录器)生成的一些日志文件.
如果日志中有异常条目,我需要从异常的顶部到实际位置收集有关堆栈跟踪所涉及方法的聚合信息.
不幸的是,默认情况下,Java printStackTrace()不会打印调用堆栈中的每个方法,而是打印一定数量,其余的只是被引用为16 more....
如果我能自己捕获异常,我会使用getStackTrace()并自己打印,但根本原因从未包含在此库引发的异常中.
有没有办法让Java在堆栈跟踪中打印整个调用堆栈?
除了我的情况,常见的日志框架可以选择吗?
编辑:该程序在Sun的JVM上使用JDK 1.5.0_09运行.无法改变这一点.
我刚收到此错误消息:
...
from c:/ruby/lib/ruby/gems/1.8/gems/...
... 10 levels...
from c:/ruby/lib/ruby/gems/1.8/gems/...
...
Run Code Online (Sandbox Code Playgroud)
并且bug(当然)隐藏在某处... 10 levels....
如何强制ruby显示完整的堆栈跟踪?
在运行时崩溃的异常堆栈中,Swift经常说参数是Dead或Exploded.它的含义是什么,是否对调试有用?
例如:
-> 0x100209cf0 <function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> ()+44>: brk #0x1
Run Code Online (Sandbox Code Playgroud)
谢谢.
抛出异常时,其文本包含堆栈跟踪.我可以以某种方式获得堆栈跟踪文本(包括文件和行)没有例外吗?
public void f()
{
//blah
string stacktrace = ???;
//blah
}
Run Code Online (Sandbox Code Playgroud) 我想在我的代码的任何函数中看到堆栈跟踪,所以我做了这样的事情来调用它并打印堆栈跟踪:
public function PrintStackTrace() {
try {
throw new Error('StackTrace');
} catch (e:Error) {
trace(e.getStackTrace());
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有其他方法可以做到这一点.在某些地方,Error类创建堆栈跟踪,但也许它没有使用ActionScript 3.0,所以也许它不可行,但我想知道.
谢谢!
我用"throw;"重新抛出异常,但堆栈跟踪不正确:
static void Main(string[] args) {
try {
try {
throw new Exception("Test"); //Line 12
}
catch (Exception ex) {
throw; //Line 15
}
}
catch (Exception ex) {
System.Diagnostics.Debug.Write(ex.ToString());
}
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
正确的堆栈跟踪应该是:
Run Code Online (Sandbox Code Playgroud)System.Exception: Test at ConsoleApplication1.Program.Main(String[] args) in Program.cs:Line 12
但我得到:
Run Code Online (Sandbox Code Playgroud)System.Exception: Test at ConsoleApplication1.Program.Main(String[] args) in Program.cs:Line 15
但第15行是"抛出"的位置.我用.NET 3.5进行了测试.
我有以下堆栈跟踪:
0 MyApp 0x000833a3 +[TFCrashHandler backtrace] + 26
1 MyApp 0x000836bd TFSignalHandler + 28
2 libsystem_c.dylib 0x33eac727 _sigtramp + 34
3 ??? 0x00000002 0x0 + 2
4 MyApp 0x000803f1 msgpack_unpack_next + 112
5 MyApp 0x0007faeb +[MessagePackParser parseData:] + 74
6 MyApp 0x0007f84b -[NSData(NSData_MessagePack) messagePackParse] + 26
7 MyApp 0x000254c3 +[Http get:params:cacheMins:msgPack:complete:] + 146
...
Run Code Online (Sandbox Code Playgroud)
我想知道如何阅读它:
非常感谢
public static Logger getLogger() {
final Throwable t = new Throwable();
final StackTraceElement methodCaller = t.getStackTrace()[1];
final Logger logger = Logger.getLogger(methodCaller.getClassName());
logger.setLevel(ResourceManager.LOGLEVEL);
return logger;
}
Run Code Online (Sandbox Code Playgroud)
此方法将返回一个记录器,该记录器知道它正在记录的类.反对它的任何想法?
许多年后:https://github.com/yanchenko/droidparts/blob/master/droidparts/src/org/droidparts/util/L.java
backtrace函数给出一组回溯如何用函数名/文件名/行号映射它?
for ex:-
backtrace() returned 8 addresses
./libtst.so(myfunc5+0x2b) [0xb7767767]
./libtst.so(fun4+0x4a) [0xb7767831]
./libtst.so(fun3+0x48) [0xb776787f]
./libtst.so(fun2+0x35) [0xb77678ba]
./libtst.so(fun1+0x35) [0xb77678f5]
./a.out() [0x80485b9]
/lib/libc.so.6(__libc_start_main+0xe5) [0xb75e9be5]
./a.out() [0x80484f1]
Run Code Online (Sandbox Code Playgroud)
从上面的堆栈我怎样才能获得文件名和行号?我做了以下事情,但没有运气.如果我错了,请纠正我:)
for ex:-
./libtst.so(fun2+0x35) [0xb77dc887]
0xb77dc887(fun2 addr+offset)-0xb77b6000 (lib starting addr) = 0x26887 (result)
result is no way related to function in nm output.
I used addr2line command:-
addr2line -f -e libtst.so 0xb77dc887
??
??:0
Run Code Online (Sandbox Code Playgroud)
那么,我如何在运行时或运行后解析?提前致谢...
nm:-
00000574 T _init
00000680 t __do_global_dtors_aux
00000700 t frame_dummy
00000737 t __i686.get_pc_thunk.bx
0000073c T myfunc5
000007e7 T fun4
00000837 T fun3 …Run Code Online (Sandbox Code Playgroud) 许多其他编程语言(例如java,ruby)中的异常/错误总是提供stacktrace/backtrace信息.
在JavaScript中未处理的错误被window.onError捕获.
虽然该函数没有获取Error对象,但我们无法访问该对象的stack属性.
是否有任何可靠的信息来源,关于何时会有任何变化?