Sentry android ANR,会不会误报?
Sentry android ANR, could there be a false alarm?
我正在使用 Sentry-Android 2.3.0 SDK 来收集 android 崩溃和 ANR,在过去的几个月里,出现了几个奇怪的 ANR。所有这些都发生在用户一段时间后打开设备时,所有这些都发生在 MessageQueue.next
方法中。在深入挖掘了Sentry SDK源码后,发现Android中处理ANR的核心逻辑在classANRWatchDog.java中,恕我直言,可以简化如下:
public class Test {
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
class MainThread extends Thread {
public void run() {
while (!isInterrupted()) {
Runnable r;
try {
r = queue.take();
} catch (InterruptedException e) { return; }
r.run();
}
}
}
class WorkerThread extends Thread {
private AtomicLong tick = new AtomicLong(0);
private AtomicBoolean reported = new AtomicBoolean(false);
private final Runnable ticker = new Runnable() {
public void run() {
tick = new AtomicLong(0);
reported.set(false);
}
};
public void run() {
while (!isInterrupted()) {
boolean needPost = tick.get() == 0;
tick.addAndGet(100L);
if (needPost) {
queue.add(ticker);
}
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
return;
}
if (tick.get() != 0 && !reported.get()) {
// TODO: if ActivityManager available, further check
reported.set(true);
throw new RuntimeException("Bang!");
}
}
}
}
}
我的问题是,tick 变量不应该是 volatile
吗?此代码会导致可见性问题吗?如果是这样,这段代码会导致生产代码误报吗?
afaik AtomicLong
getter 和 setter read/write 来自易失性字段,因此没有必要,我们已对此算法进行改进以避免 false/positives,请升级SDK到最新版本
我正在使用 Sentry-Android 2.3.0 SDK 来收集 android 崩溃和 ANR,在过去的几个月里,出现了几个奇怪的 ANR。所有这些都发生在用户一段时间后打开设备时,所有这些都发生在 MessageQueue.next
方法中。在深入挖掘了Sentry SDK源码后,发现Android中处理ANR的核心逻辑在classANRWatchDog.java中,恕我直言,可以简化如下:
public class Test {
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
class MainThread extends Thread {
public void run() {
while (!isInterrupted()) {
Runnable r;
try {
r = queue.take();
} catch (InterruptedException e) { return; }
r.run();
}
}
}
class WorkerThread extends Thread {
private AtomicLong tick = new AtomicLong(0);
private AtomicBoolean reported = new AtomicBoolean(false);
private final Runnable ticker = new Runnable() {
public void run() {
tick = new AtomicLong(0);
reported.set(false);
}
};
public void run() {
while (!isInterrupted()) {
boolean needPost = tick.get() == 0;
tick.addAndGet(100L);
if (needPost) {
queue.add(ticker);
}
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
return;
}
if (tick.get() != 0 && !reported.get()) {
// TODO: if ActivityManager available, further check
reported.set(true);
throw new RuntimeException("Bang!");
}
}
}
}
}
我的问题是,tick 变量不应该是 volatile
吗?此代码会导致可见性问题吗?如果是这样,这段代码会导致生产代码误报吗?
afaik AtomicLong
getter 和 setter read/write 来自易失性字段,因此没有必要,我们已对此算法进行改进以避免 false/positives,请升级SDK到最新版本