AndroidPerformanceMonitor icon indicating copy to clipboard operation
AndroidPerformanceMonitor copied to clipboard

打印主线程堆栈的问题

Open LNeway opened this issue 8 years ago • 4 comments

有一个问题:

关于打印主线程堆栈的实现:

StackSampler 的 doSimple 实现如下

`protected void doSample() { StringBuilder stringBuilder = new StringBuilder();

    for (StackTraceElement stackTraceElement : mCurrentThread.getStackTrace()) {
        stringBuilder
                .append(stackTraceElement.toString())
                .append(BlockInfo.SEPARATOR);
    }
    Log.e(TAG, stringBuilder.toString());

    synchronized (sStackMap) {
        if (sStackMap.size() == mMaxEntryCount && mMaxEntryCount > 0) {
            sStackMap.remove(sStackMap.keySet().iterator().next());
        }
        sStackMap.put(System.currentTimeMillis(), stringBuilder.toString());
    }
}`

当前只是直接 通过调用 mCurrentThread 的 getStackTrace 来获取堆栈信息,但是这个时候如果在这个方法之前有耗时的操作(比如直接sleep(10 * 1000)),那么再去获取主线程堆栈信息的时候是不是可能出现获取的堆栈不是真正出问题的地方?

在我自己测试的情况下,已经是无法正常打印堆栈信息。

LNeway avatar Mar 30 '17 05:03 LNeway

我也有类似的疑问,如果监控时间是500ms, 这个msg执行包括3部分,A耗时400ms,B耗时80ms, C耗时30ms, 那么400+80+30 > 500,所以会打印日志,不过它打印的堆栈应该是第500ms的,那么就对应C, 但是最耗时的应该是A。。。这样是不是这种方法不可避免的缺点呢?

kry4ever avatar Apr 11 '17 03:04 kry4ever

感觉使用这种方法不可避免地会出现如上问题

twlkyao avatar May 25 '17 07:05 twlkyao

我想的是,发现有卡顿的时候直接获线程堆栈,传过来是不是就可以解决这个问题了?

LNeway avatar May 25 '17 13:05 LNeway

@LNeway 写个代码发个MR看看?

markzhai avatar May 25 '17 14:05 markzhai