Java类是用调试符号编译的,但stacktrace中没有显示行号?
我收到了一个使用我编写的Java库的人的日志,但令人困惑的是stacktrace没有列出我的方法的行号 这似乎表明该类是在没有调试符号的情况下编译的,但如果我从他们使用的JAR中获取有问题的Java类是用调试符号编译的,但stacktrace中没有显示行号?,java,android,stack-trace,bytecode,debug-symbols,Java,Android,Stack Trace,Bytecode,Debug Symbols,我收到了一个使用我编写的Java库的人的日志,但令人困惑的是stacktrace没有列出我的方法的行号 这似乎表明该类是在没有调试符号的情况下编译的,但如果我从他们使用的JAR中获取有问题的.class文件并在其上运行javap-v,我可以看到该类实际上是用调试符号编译的,并且有一个LineNumber可用于有问题的方法: LineNumberTable: line 387: 0 line 389: 4 line 391: 11
.class
文件并在其上运行javap-v
,我可以看到该类实际上是用调试符号编译的,并且有一个LineNumber可用于有问题的方法:
LineNumberTable:
line 387: 0
line 389: 4
line 391: 11
line 393: 23
line 395: 30
line 397: 62
line 399: 69
line 412: 101
line 413: 107
line 414: 116
line 415: 122
line 416: 134
line 417: 141
line 418: 150
line 419: 156
line 421: 168
line 422: 178
line 423: 192
line 425: 206
line 431: 214
line 428: 217
line 430: 219
line 432: 224
那么我的问题就变成了,即使我已经确认.class
文件中有调试符号,是什么导致行号没有显示在stacktrace中?如果这很重要的话,这是在安卓的背景下。不,它不是ProGuard或剥离调试符号的东西,因为行号列在堆栈跟踪的其他部分。所以我找到了这个问题
一个简短的提示,我可能应该在我的问题中提到这一点:所讨论的堆栈跟踪不是崩溃/异常的结果,而是打印出来的,以显示线程在监视器杀死它之前的位置,因为它没有响应
synchronized
方法,而另一个线程正在执行另一个synchronized
方法时,堆栈跟踪的外观与ART和JVM不同强>公共类MainActivity扩展活动
{
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
启动线程(“TH1”);
睡眠(100);
启动线程(“TH2”);
睡眠(20);
dumpThreadTraces();
}
无效启动线程(字符串名称)
{
Thread Thread=新线程(new Runnable()
{
@凌驾
公开募捐
{
doThings();
}
});
thread.setName(name);
thread.start();
}
同步的void doThings()
{
睡眠(1000);
}
void dumpThreadTraces()
{
Map traces=Thread.getAllStackTraces();
Set threads=traces.keySet();
用于(螺纹th:螺纹)
{
if(th.getName().startsWith(“th”))
{
logStackTrace(th,traces.get(th));
}
}
}
void logStackTrace(线程,StackTraceElement[]stackTrace)
{
System.out.printf(“线程id=%d name=\%s\”\n,thread.getId(),thread.getName());
logStackFrames(stackTrace);
}
void logStackFrames(StackTraceElement[]stackTrace)
{
用于(StackTraceElement帧:stackTrace)
{
System.out.printf(“在%s\n”,frame.toString());
}
}
无效睡眠(整数毫秒)
{
尝试
{
睡眠(毫秒);
}
捕捉(中断异常e)
{
e、 printStackTrace();
}
}
}
运行时,以下内容将打印到logcat:
I/System.out: thread id=2051 name="TH1"
I/System.out: at java.lang.Thread.sleep(Native Method)
I/System.out: at java.lang.Thread.sleep(Thread.java:371)
I/System.out: at java.lang.Thread.sleep(Thread.java:313)
I/System.out: at com.domain.helloworld.MainActivity.sleep(MainActivity.java:94)
I/System.out: at com.domain.helloworld.MainActivity.doThings(MainActivity.java:58)
I/System.out: at com.domain.helloworld.MainActivity$1.run(MainActivity.java:48)
I/System.out: at java.lang.Thread.run(Thread.java:761)
I/System.out: thread id=2052 name="TH2"
I/System.out: at com.domain.helloworld.MainActivity.doThings(MainActivity.java)
I/System.out: at com.domain.helloworld.MainActivity$1.run(MainActivity.java:48)
I/System.out: at java.lang.Thread.run(Thread.java:761)
请注意,对于线程2,顶层堆栈跟踪元素的行号是如何不打印的
at com.domain.helloworld.MainActivity.doThings(MainActivity.java)
“他们有没有在上面进行任何模糊处理?”EugenMartynov说,他们并不知道of@EugenMartynov嗯,我想知道我是否能看到僵局?正在讨论的方法与用户正在调用的另一个方法同步。stacktrace是什么样子的?没有代码和stacktrace很难说。。。我们只能猜测。我猜可能有什么东西在修改类/方法本身,它删除了调试信息,或者堆栈本身被修改了