Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Decompiler freezes for some apps (deadlock) #257

Closed
bagipro opened this issue Apr 12, 2018 · 1 comment
Closed

Decompiler freezes for some apps (deadlock) #257

bagipro opened this issue Apr 12, 2018 · 1 comment

Comments

@bagipro
Copy link
Collaborator

bagipro commented Apr 12, 2018

Hi, I met that in 10% of the processing apps. Example app is Dropbox: https://play.google.com/store/apps/details?id=com.dropbox.android

I ran jstack and it shows the following thing:

2018-04-12 17:30:48
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.74-b02 mixed mode):

"pool-1-thread-8" #17 prio=5 os_prio=0 tid=0x000000003cb36000 nid=0xea0 waiting for monitor entry [0x0000000042d5f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at jadx.core.ProcessClass.process(ProcessClass.java:28)
        - waiting to lock <0x00000004097f45c8> (a jadx.core.dex.info.ClassInfo)
        at jadx.core.ProcessClass.processDependencies(ProcessClass.java:60)
        at jadx.core.ProcessClass.process(ProcessClass.java:39)
        - locked <0x0000000409a97c78> (a jadx.core.dex.info.ClassInfo)
        at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:282)
        at jadx.api.JavaClass.decompile(JavaClass.java:62)
        - locked <0x0000000409bd6df0> (a jadx.api.JavaClass)
        at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
        at jadx.api.JadxDecompiler$$Lambda$8/829737737.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - <0x000000040c54cc18> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"pool-1-thread-7" #16 prio=5 os_prio=0 tid=0x000000003cb35800 nid=0x14dc waiting for monitor entry [0x000000004235e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at jadx.core.dex.visitors.ReSugarCode.getEnumMap(ReSugarCode.java:153)
        - waiting to lock <0x0000000409a97c78> (a jadx.core.dex.info.ClassInfo)
        at jadx.core.dex.visitors.ReSugarCode.processEnumSwitch(ReSugarCode.java:125)
        at jadx.core.dex.visitors.ReSugarCode.process(ReSugarCode.java:69)
        at jadx.core.dex.visitors.ReSugarCode.visit(ReSugarCode.java:53)
        at jadx.core.dex.visitors.DepthTraversal.visit(DepthTraversal.java:31)
        at jadx.core.dex.visitors.DepthTraversal.visit(DepthTraversal.java:17)
        at jadx.core.ProcessClass.process(ProcessClass.java:34)
        - locked <0x00000004097f45c8> (a jadx.core.dex.info.ClassInfo)
        at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:282)
        at jadx.api.JavaClass.decompile(JavaClass.java:62)
        - locked <0x0000000409bd6d98> (a jadx.api.JavaClass)
        at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
        at jadx.api.JadxDecompiler$$Lambda$8/829737737.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - <0x0000000409cc3338> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"pool-1-thread-6" #15 prio=5 os_prio=0 tid=0x000000003ce6b800 nid=0x1164 waiting for monitor entry [0x000000004195e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at jadx.core.ProcessClass.process(ProcessClass.java:28)
        - waiting to lock <0x00000004099d8b98> (a jadx.core.dex.info.ClassInfo)
        at jadx.core.ProcessClass.processDependencies(ProcessClass.java:60)
        at jadx.core.ProcessClass.process(ProcessClass.java:39)
        - locked <0x0000000409a96ef8> (a jadx.core.dex.info.ClassInfo)
        at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:282)
        at jadx.api.JavaClass.decompile(JavaClass.java:62)
        - locked <0x0000000409bd6f50> (a jadx.api.JavaClass)
        at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
        at jadx.api.JadxDecompiler$$Lambda$8/829737737.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - <0x0000000409cc3808> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"pool-1-thread-5" #14 prio=5 os_prio=0 tid=0x000000003ce6b000 nid=0x1018 waiting for monitor entry [0x0000000040f5e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at jadx.core.ProcessClass.process(ProcessClass.java:28)
        - waiting to lock <0x0000000409a98058> (a jadx.core.dex.info.ClassInfo)
        at jadx.core.ProcessClass.processDependencies(ProcessClass.java:60)
        at jadx.core.ProcessClass.process(ProcessClass.java:39)
        - locked <0x00000004099d8b98> (a jadx.core.dex.info.ClassInfo)
        at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:282)
        at jadx.api.JavaClass.decompile(JavaClass.java:62)
        - locked <0x0000000409bd6e48> (a jadx.api.JavaClass)
        at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
        at jadx.api.JadxDecompiler$$Lambda$8/829737737.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - <0x0000000409cc3ca8> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"pool-1-thread-4" #13 prio=5 os_prio=0 tid=0x000000003ce69800 nid=0x153c waiting for monitor entry [0x000000004055f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at jadx.core.ProcessClass.process(ProcessClass.java:28)
        - waiting to lock <0x00000004097f45c8> (a jadx.core.dex.info.ClassInfo)
        at jadx.core.ProcessClass.processDependencies(ProcessClass.java:60)
        at jadx.core.ProcessClass.process(ProcessClass.java:39)
        - locked <0x0000000409a98058> (a jadx.core.dex.info.ClassInfo)
        at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:282)
        at jadx.api.JavaClass.decompile(JavaClass.java:62)
        - locked <0x0000000409bd6d40> (a jadx.api.JavaClass)
        at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
        at jadx.api.JadxDecompiler$$Lambda$8/829737737.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - <0x0000000409cd2028> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"pool-1-thread-3" #12 prio=5 os_prio=0 tid=0x000000003c804000 nid=0x2a4 waiting for monitor entry [0x000000003fb5f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at jadx.core.ProcessClass.process(ProcessClass.java:28)
        - waiting to lock <0x0000000409a970b0> (a jadx.core.dex.info.ClassInfo)
        at jadx.core.ProcessClass.processDependencies(ProcessClass.java:60)
        at jadx.core.ProcessClass.process(ProcessClass.java:39)
        - locked <0x0000000409a96d60> (a jadx.core.dex.info.ClassInfo)
        at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:282)
        at jadx.api.JavaClass.decompile(JavaClass.java:62)
        - locked <0x0000000409bd6ef8> (a jadx.api.JavaClass)
        at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
        at jadx.api.JadxDecompiler$$Lambda$8/829737737.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - <0x0000000409cd2628> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"pool-1-thread-2" #11 prio=5 os_prio=0 tid=0x000000003c803000 nid=0x12c4 waiting for monitor entry [0x000000003f15f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at jadx.core.ProcessClass.process(ProcessClass.java:28)
        - waiting to lock <0x00000004097f45c8> (a jadx.core.dex.info.ClassInfo)
        at jadx.core.ProcessClass.processDependencies(ProcessClass.java:60)
        at jadx.core.ProcessClass.process(ProcessClass.java:39)
        - locked <0x0000000409a97ac0> (a jadx.core.dex.info.ClassInfo)
        at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:282)
        at jadx.api.JavaClass.decompile(JavaClass.java:62)
        - locked <0x0000000409bd6978> (a jadx.api.JavaClass)
        at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
        at jadx.api.JadxDecompiler$$Lambda$8/829737737.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - <0x0000000409cd2f10> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"pool-1-thread-1" #10 prio=5 os_prio=0 tid=0x000000003c802800 nid=0x159c waiting for monitor entry [0x000000003e75f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at jadx.core.ProcessClass.process(ProcessClass.java:28)
        - waiting to lock <0x00000004099d8b98> (a jadx.core.dex.info.ClassInfo)
        at jadx.core.ProcessClass.processDependencies(ProcessClass.java:60)
        at jadx.core.ProcessClass.process(ProcessClass.java:39)
        - locked <0x0000000409a970b0> (a jadx.core.dex.info.ClassInfo)
        at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:282)
        at jadx.api.JavaClass.decompile(JavaClass.java:62)
        - locked <0x0000000409bd6ea0> (a jadx.api.JavaClass)
        at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
        at jadx.api.JadxDecompiler$$Lambda$8/829737737.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - <0x0000000409cd3440> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"Service Thread" #9 daemon prio=9 os_prio=0 tid=0x000000003a0f0800 nid=0x1504 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C1 CompilerThread2" #8 daemon prio=9 os_prio=2 tid=0x0000000036449800 nid=0x534 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread1" #7 daemon prio=9 os_prio=2 tid=0x0000000036446800 nid=0x15b8 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x0000000036443000 nid=0xc94 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x0000000036442000 nid=0x1670 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000003643e800 nid=0xc1c runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000003642a800 nid=0x3d4 in Object.wait() [0x000000003899f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000004090fa9a8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - locked <0x00000004090fa9a8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

   Locked ownable synchronizers:
        - None

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000000002770800 nid=0x7c0 in Object.wait() [0x0000000037f9e000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x0000000401bf8b28> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x0000000401bf8b28> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

   Locked ownable synchronizers:
        - None

"main" #1 prio=5 os_prio=0 tid=0x0000000002682800 nid=0x1608 waiting on condition [0x000000000319e000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x0000000409cdb8b0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
        at java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1465)
        at jadx.api.JadxDecompiler.save(JadxDecompiler.java:147)
        at jadx.api.JadxDecompiler.save(JadxDecompiler.java:132)
        at jadx.cli.JadxCLI.processAndSave(JadxCLI.java:32)
        at jadx.cli.JadxCLI.main(JadxCLI.java:16)

   Locked ownable synchronizers:
        - None

"VM Thread" os_prio=2 tid=0x0000000036408000 nid=0x15e0 runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000002698000 nid=0x1250 runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000002699800 nid=0x244 runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000269b000 nid=0x1438 runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000269c800 nid=0x5b8 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x000000003a12f000 nid=0xddc waiting on condition

JNI global references: 244


Found one Java-level deadlock:
=============================
"pool-1-thread-8":
  waiting to lock monitor 0x0000000002778558 (object 0x00000004097f45c8, a jadx.core.dex.info.ClassInfo),
  which is held by "pool-1-thread-7"
"pool-1-thread-7":
  waiting to lock monitor 0x000000003b9123f8 (object 0x0000000409a97c78, a jadx.core.dex.info.ClassInfo),
  which is held by "pool-1-thread-8"

Java stack information for the threads listed above:
===================================================
"pool-1-thread-8":
        at jadx.core.ProcessClass.process(ProcessClass.java:28)
        - waiting to lock <0x00000004097f45c8> (a jadx.core.dex.info.ClassInfo)
        at jadx.core.ProcessClass.processDependencies(ProcessClass.java:60)
        at jadx.core.ProcessClass.process(ProcessClass.java:39)
        - locked <0x0000000409a97c78> (a jadx.core.dex.info.ClassInfo)
        at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:282)
        at jadx.api.JavaClass.decompile(JavaClass.java:62)
        - locked <0x0000000409bd6df0> (a jadx.api.JavaClass)
        at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
        at jadx.api.JadxDecompiler$$Lambda$8/829737737.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
"pool-1-thread-7":
        at jadx.core.dex.visitors.ReSugarCode.getEnumMap(ReSugarCode.java:153)
        - waiting to lock <0x0000000409a97c78> (a jadx.core.dex.info.ClassInfo)
        at jadx.core.dex.visitors.ReSugarCode.processEnumSwitch(ReSugarCode.java:125)
        at jadx.core.dex.visitors.ReSugarCode.process(ReSugarCode.java:69)
        at jadx.core.dex.visitors.ReSugarCode.visit(ReSugarCode.java:53)
        at jadx.core.dex.visitors.DepthTraversal.visit(DepthTraversal.java:31)
        at jadx.core.dex.visitors.DepthTraversal.visit(DepthTraversal.java:17)
        at jadx.core.ProcessClass.process(ProcessClass.java:34)
        - locked <0x00000004097f45c8> (a jadx.core.dex.info.ClassInfo)
        at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:282)
        at jadx.api.JavaClass.decompile(JavaClass.java:62)
        - locked <0x0000000409bd6d98> (a jadx.api.JavaClass)
        at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
        at jadx.api.JadxDecompiler$$Lambda$8/829737737.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.
@skylot
Copy link
Owner

skylot commented Apr 14, 2018

@sergey-wowwow I fixed enum processing order and remove this synchronization, so deadlock will not occur anymore.

@skylot skylot closed this as completed Apr 14, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants