Java类是用调试符号编译的,但stacktrace中没有显示行号?

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

我收到了一个使用我编写的Java库的人的日志,但令人困惑的是stacktrace没有列出我的方法的行号

这似乎表明该类是在没有调试符号的情况下编译的,但如果我从他们使用的JAR中获取有问题的
.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不同
  • 在ART中,顶部堆栈帧将显示为方法中没有行号的一行,但在JVM中,它将显示为方法中有行号的第一行

    以下是Android的“完整、最小、可复制”示例:

    公共类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很难说。。。我们只能猜测。我猜可能有什么东西在修改类/方法本身,它删除了调试信息,或者堆栈本身被修改了