mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 22:51:17 +07:00
366 lines
22 KiB
Groovy
366 lines
22 KiB
Groovy
/*
|
|
* Copyright 2000-2016 JetBrains s.r.o.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package com.intellij.unscramble
|
|
|
|
import com.intellij.testFramework.PlatformTestUtil
|
|
import groovy.transform.CompileStatic
|
|
import junit.framework.TestCase
|
|
/**
|
|
* @author peter
|
|
*/
|
|
@CompileStatic
|
|
class ThreadDumpParserTest extends TestCase {
|
|
void "test waiting threads are not locking"() {
|
|
String text = """
|
|
"1" daemon prio=10 tid=0x00002b5bf8065000 nid=0x4294 waiting for monitor entry [0x00002b5aadb5d000]
|
|
java.lang.Thread.State: BLOCKED (on object monitor)
|
|
at bitronix.tm.resource.common.XAPool.findXAResourceHolder(XAPool.java:213)
|
|
- waiting to lock <0x0000000092daa138> (a bitronix.tm.resource.common.XAPool)
|
|
at bitronix.tm.resource.jdbc.PoolingDataSource.findXAResourceHolder(PoolingDataSource.java:345)
|
|
at bitronix.tm.resource.ResourceRegistrar.findXAResourceHolder(ResourceRegistrar.java:124)
|
|
at bitronix.tm.BitronixTransaction.enlistResource(BitronixTransaction.java:120)
|
|
|
|
"2" daemon prio=10 tid=0x00002b5bf806f000 nid=0xfbd7 waiting for monitor entry [0x00002b5aaf87a000]
|
|
java.lang.Thread.State: BLOCKED (on object monitor)
|
|
at java.lang.Object.wait(Native Method)
|
|
at bitronix.tm.resource.common.XAPool.getConnectionHandle(XAPool.java:150)
|
|
- locked <0x0000000092daa138> (a bitronix.tm.resource.common.XAPool)
|
|
at bitronix.tm.resource.common.XAPool.getConnectionHandle(XAPool.java:91)
|
|
- locked <0x0000000092daa138> (a bitronix.tm.resource.common.XAPool)
|
|
|
|
"3" daemon prio=10 tid=0x00002b5bf8025000 nid=0x4283 waiting for monitor entry [0x00002b5aaef71000]
|
|
java.lang.Thread.State: BLOCKED (on object monitor)
|
|
at java.lang.Object.wait(Native Method)
|
|
at bitronix.tm.resource.common.XAPool.getConnectionHandle(XAPool.java:150)
|
|
- locked <0x0000000092daa138> (a bitronix.tm.resource.common.XAPool)
|
|
at bitronix.tm.resource.common.XAPool.getConnectionHandle(XAPool.java:91)
|
|
- locked <0x0000000092daa138> (a bitronix.tm.resource.common.XAPool)
|
|
|
|
"0" daemon prio=10 tid=0x00002b5bf8006000 nid=0xfbb1 waiting for monitor entry [0x00002b5aae365000]
|
|
java.lang.Thread.State: BLOCKED (on object monitor)
|
|
at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1563)
|
|
- waiting to lock <0x00000000c2976880> (a oracle.jdbc.driver.T4CConnection)
|
|
at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:94)
|
|
at oracle.jdbc.driver.OraclePreparedStatementWrapper.close(OraclePreparedStatementWrapper.java:80)
|
|
at bitronix.tm.resource.jdbc.JdbcPooledConnection\\\\\$1.onEviction(JdbcPooledConnection.java:95)
|
|
at bitronix.tm.resource.jdbc.LruStatementCache.fireEvictionEvent(LruStatementCache.java:205)
|
|
at bitronix.tm.resource.jdbc.LruStatementCache.clear(LruStatementCache.java:169)
|
|
- locked <0x00000000c2b3bd50> (a java.util.LinkedHashMap)
|
|
at bitronix.tm.resource.jdbc.JdbcPooledConnection.close(JdbcPooledConnection.java:172)
|
|
at bitronix.tm.resource.common.XAPool.getConnectionHandle(XAPool.java:139)
|
|
- locked <0x0000000092daa138> (a bitronix.tm.resource.common.XAPool)
|
|
at bitronix.tm.resource.common.XAPool.getConnectionHandle(XAPool.java:91)
|
|
- locked <0x0000000092daa138> (a bitronix.tm.resource.common.XAPool)
|
|
|
|
"4" daemon prio=10 tid=0x00002b5c54001000 nid=0x4b8d runnable [0x00002b5aae66a000]
|
|
java.lang.Thread.State: RUNNABLE
|
|
at java.net.SocketInputStream.socketRead0(Native Method)
|
|
at java.net.SocketInputStream.read(SocketInputStream.java:150)
|
|
at java.net.SocketInputStream.read(SocketInputStream.java:121)
|
|
at oracle.net.ns.Packet.receive(Packet.java:300)
|
|
at oracle.net.ns.DataPacket.receive(DataPacket.java:106)
|
|
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315)
|
|
at oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
|
|
at oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
|
|
at oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
|
|
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
|
|
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
|
|
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
|
|
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
|
|
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
|
|
at oracle.jdbc.driver.T4CTTIoping.doOPING(T4CTTIoping.java:52)
|
|
at oracle.jdbc.driver.T4CConnection.doPingDatabase(T4CConnection.java:4008)
|
|
- locked <0x00000000c2976880> (a oracle.jdbc.driver.T4CConnection)
|
|
at oracle.jdbc.driver.PhysicalConnection\$3.run(PhysicalConnection.java:7868)
|
|
at java.lang.Thread.run(Thread.java:722)
|
|
"""
|
|
|
|
def threads = ThreadDumpParser.parse(text)
|
|
assert threads.size() == 5
|
|
for (i in 0..4) {
|
|
assert threads[i].name == String.valueOf(i)
|
|
}
|
|
|
|
assert threads[4].isAwaitedBy(threads[0])
|
|
assert threads[0].isAwaitedBy(threads[1])
|
|
}
|
|
|
|
void "test YourKit format"() {
|
|
def text = """
|
|
Stacks at 2017-05-03 01:07:25 PM (uptime 4h 21m 28s) Threads shown: 38 of 46
|
|
|
|
ApplicationImpl pooled thread 228 [WAITING]
|
|
java.lang.Thread.run() Thread.java:745
|
|
|
|
ApplicationImpl pooled thread 234 [WAITING] [DAEMON]
|
|
java.lang.Thread.run() Thread.java:745
|
|
|
|
ApplicationImpl pooled thread 6 [RUNNABLE, IN_NATIVE]
|
|
java.net.DatagramSocket.receive(DatagramPacket) DatagramSocket.java:812
|
|
com.intellij.a.f.a.c.a() c.java:60
|
|
com.intellij.a.f.a.d.run() d.java:20
|
|
java.lang.Thread.run() Thread.java:745
|
|
"""
|
|
def threads = ThreadDumpParser.parse(text)
|
|
assert threads.collect { it.name } == ['ApplicationImpl pooled thread 228', 'ApplicationImpl pooled thread 234', 'ApplicationImpl pooled thread 6']
|
|
assert threads.collect { it.state } == ['WAITING', 'WAITING', 'RUNNABLE, IN_NATIVE']
|
|
assert threads.collect { it.daemon } == [false, true, false]
|
|
assert threads.collect { it.stackTrace.readLines().size() } == [2, 2, 5] // thread name is included into stack trace
|
|
}
|
|
|
|
void "test YourKit 2017 format"() {
|
|
def text = '''
|
|
Stacks at 2017-06-08 12:56:31 PM. Uptime is 23m 47s 200ms.
|
|
|
|
thread 23 State: RUNNABLE CPU usage on sample: 968ms
|
|
com.intellij.openapi.util.io.win32.IdeaWin32.listChildren0(String) IdeaWin32.java (native)
|
|
com.intellij.openapi.util.io.win32.IdeaWin32.listChildren(String) IdeaWin32.java:136
|
|
com.intellij.openapi.vfs.impl.win32.Win32FsCache.list(VirtualFile) Win32FsCache.java:58
|
|
com.intellij.openapi.vfs.impl.win32.Win32LocalFileSystem.list(VirtualFile) Win32LocalFileSystem.java:57
|
|
com.intellij.openapi.vfs.newvfs.persistent.RefreshWorker.partialDirRefresh(NewVirtualFileSystem, TObjectHashingStrategy, VirtualDirectoryImpl) RefreshWorker.java:272
|
|
com.intellij.openapi.vfs.newvfs.persistent.RefreshWorker.processQueue(NewVirtualFileSystem, PersistentFS) RefreshWorker.java:124
|
|
com.intellij.openapi.vfs.newvfs.persistent.RefreshWorker.scan() RefreshWorker.java:85
|
|
com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.scan() RefreshSessionImpl.java:147
|
|
com.intellij.openapi.vfs.newvfs.RefreshQueueImpl.doScan(RefreshSessionImpl) RefreshQueueImpl.java:91
|
|
com.intellij.openapi.vfs.newvfs.RefreshQueueImpl.lambda$queueSession$1(RefreshSessionImpl, TransactionId, ModalityState) RefreshQueueImpl.java:74
|
|
com.intellij.openapi.vfs.newvfs.RefreshQueueImpl$$Lambda$242.run()
|
|
java.util.concurrent.Executors$RunnableAdapter.call() Executors.java:511
|
|
java.util.concurrent.FutureTask.run() FutureTask.java:266
|
|
com.intellij.util.concurrency.BoundedTaskExecutor$2.run() BoundedTaskExecutor.java:212
|
|
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) ThreadPoolExecutor.java:1142
|
|
java.util.concurrent.ThreadPoolExecutor$Worker.run() ThreadPoolExecutor.java:617
|
|
java.lang.Thread.run() Thread.java:745
|
|
|
|
thread 24 State: WAITING CPU usage on sample: 0ms
|
|
sun.misc.Unsafe.park(boolean, long) Unsafe.java (native)
|
|
java.util.concurrent.locks.LockSupport.parkNanos(Object, long) LockSupport.java:215
|
|
java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue$TransferStack$SNode, boolean, long) SynchronousQueue.java:460
|
|
java.util.concurrent.SynchronousQueue$TransferStack.transfer(Object, boolean, long) SynchronousQueue.java:362
|
|
java.util.concurrent.SynchronousQueue.poll(long, TimeUnit) SynchronousQueue.java:941
|
|
java.util.concurrent.ThreadPoolExecutor.getTask() ThreadPoolExecutor.java:1066
|
|
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) ThreadPoolExecutor.java:1127
|
|
java.util.concurrent.ThreadPoolExecutor$Worker.run() ThreadPoolExecutor.java:617
|
|
java.lang.Thread.run() Thread.java:745
|
|
|
|
thread 25 State: WAITING CPU usage on sample: 0ms
|
|
sun.misc.Unsafe.park(boolean, long) Unsafe.java (native)
|
|
java.util.concurrent.locks.LockSupport.parkNanos(Object, long) LockSupport.java:215
|
|
java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue$TransferStack$SNode, boolean, long) SynchronousQueue.java:460
|
|
java.util.concurrent.SynchronousQueue$TransferStack.transfer(Object, boolean, long) SynchronousQueue.java:362
|
|
java.util.concurrent.SynchronousQueue.poll(long, TimeUnit) SynchronousQueue.java:941
|
|
|
|
Swing-Shell [DAEMON] State: WAITING CPU usage on sample: 0ms
|
|
sun.misc.Unsafe.park(boolean, long) Unsafe.java (native)
|
|
java.util.concurrent.locks.LockSupport.park(Object) LockSupport.java:175
|
|
'''
|
|
def threads = ThreadDumpParser.parse(text)
|
|
assert threads.collect { it.name } == ['thread 23', 'thread 24', 'thread 25', 'Swing-Shell']
|
|
assert threads.collect { it.daemon } == [false, false, false, true]
|
|
}
|
|
|
|
void "test YourKit 2018 format"() {
|
|
def text = '''
|
|
ApplicationImpl pooled thread 81 Waiting CPU usage on sample: 0ms
|
|
sun.misc.Unsafe.park(boolean, long) Unsafe.java (native)
|
|
java.util.concurrent.locks.LockSupport.parkNanos(Object, long) LockSupport.java:215
|
|
java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue$TransferStack$SNode, boolean, long) SynchronousQueue.java:460
|
|
java.util.concurrent.SynchronousQueue$TransferStack.transfer(Object, boolean, long) SynchronousQueue.java:362
|
|
java.util.concurrent.SynchronousQueue.poll(long, TimeUnit) SynchronousQueue.java:941
|
|
java.util.concurrent.ThreadPoolExecutor.getTask() ThreadPoolExecutor.java:1066
|
|
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) ThreadPoolExecutor.java:1127
|
|
java.util.concurrent.ThreadPoolExecutor$Worker.run() ThreadPoolExecutor.java:617
|
|
java.lang.Thread.run() Thread.java:745
|
|
|
|
ApplicationImpl pooled thread 82 Waiting CPU usage on sample: 0ms
|
|
sun.misc.Unsafe.park(boolean, long) Unsafe.java (native)
|
|
java.util.concurrent.locks.LockSupport.parkNanos(Object, long) LockSupport.java:215
|
|
java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue$TransferStack$SNode, boolean, long) SynchronousQueue.java:460
|
|
java.util.concurrent.SynchronousQueue$TransferStack.transfer(Object, boolean, long) SynchronousQueue.java:362
|
|
java.util.concurrent.SynchronousQueue.poll(long, TimeUnit) SynchronousQueue.java:941
|
|
java.util.concurrent.ThreadPoolExecutor.getTask() ThreadPoolExecutor.java:1066
|
|
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) ThreadPoolExecutor.java:1127
|
|
java.util.concurrent.ThreadPoolExecutor$Worker.run() ThreadPoolExecutor.java:617
|
|
java.lang.Thread.run() Thread.java:745
|
|
|
|
ApplicationImpl pooled thread 90 Waiting CPU usage on sample: 0ms
|
|
sun.misc.Unsafe.park(boolean, long) Unsafe.java (native)
|
|
java.util.concurrent.locks.LockSupport.parkNanos(Object, long) LockSupport.java:215
|
|
java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue$TransferStack$SNode, boolean, long) SynchronousQueue.java:460
|
|
java.util.concurrent.SynchronousQueue$TransferStack.transfer(Object, boolean, long) SynchronousQueue.java:362
|
|
java.util.concurrent.SynchronousQueue.poll(long, TimeUnit) SynchronousQueue.java:941
|
|
java.util.concurrent.ThreadPoolExecutor.getTask() ThreadPoolExecutor.java:1066
|
|
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) ThreadPoolExecutor.java:1127
|
|
java.util.concurrent.ThreadPoolExecutor$Worker.run() ThreadPoolExecutor.java:617
|
|
java.lang.Thread.run() Thread.java:745
|
|
'''
|
|
def threads = ThreadDumpParser.parse(text)
|
|
assert threads.collect { it.name } == ['ApplicationImpl pooled thread 81', 'ApplicationImpl pooled thread 82', 'ApplicationImpl pooled thread 90']
|
|
}
|
|
|
|
void "test log is not a thread dump"() {
|
|
def threads = ThreadDumpParser.parse("""\
|
|
2017-05-11 15:37:22,031 [100664612] INFO - krasa.visualvm.VisualVMContext - saving context: VisualVMContext{appId=322303893654749}
|
|
2017-05-11 15:53:08,057 [101610638] INFO - krasa.visualvm.VisualVMContext - saving context: VisualVMContext{appId=323249981117880}
|
|
2017-05-11 16:37:01,448 [104244029] INFO - krasa.visualvm.VisualVMContext - saving context: VisualVMContext{appId=325883542423831}
|
|
2017-05-11 16:45:50,763 [104773344] INFO - ij.compiler.impl.CompileDriver - COMPILATION STARTED (BUILD PROCESS)
|
|
2017-05-11 16:45:50,769 [104773350] INFO - j.compiler.server.BuildManager - Using preloaded build process to compile /Users/ycx622/git/ropeengine
|
|
""")
|
|
assert threads.size() <= 1
|
|
}
|
|
|
|
void "test trace with trailing jar names is not a thread dump"() {
|
|
def threads = ThreadDumpParser.parse('''
|
|
Jun 27 02:58:45.222 WARN [][Atomikos:2] Error while retrieving xids from resource - will retry later... (com.atomikos.recovery.xa.XaResourceRecoveryManager:40)
|
|
javax.transaction.xa.XAException
|
|
\tat oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:730) ~[ojdbc-12.1.0.2.jar.8754835619381084897.jar:12.1.0.2.0]
|
|
\tat com.atomikos.datasource.xa.RecoveryScan.recoverXids(RecoveryScan.java:32) ~[transactions-jta-4.0.4.jar.3905881887605215235.jar:?]
|
|
\tat com.atomikos.recovery.xa.XaResourceRecoveryManager.retrievePreparedXidsFromXaResource(XaResourceRecoveryManager.java:158) [transactions-jta-4.0.4.jar.3905881887605215235.jar:?]
|
|
\tat com.atomikos.recovery.xa.XaResourceRecoveryManager.recover(XaResourceRecoveryManager.java:67) [transactions-jta-4.0.4.jar.3905881887605215235.jar:?]
|
|
\tat com.atomikos.datasource.xa.XATransactionalResource.recover(XATransactionalResource.java:451) [transactions-jta-4.0.4.jar.3905881887605215235.jar:?]
|
|
\tat com.atomikos.icatch.imp.TransactionServiceImp.performRecovery(TransactionServiceImp.java:490) [transactions-4.0.4.jar.3144743539643303549.jar:?]
|
|
\tat com.atomikos.icatch.imp.TransactionServiceImp.access$000(TransactionServiceImp.java:56) [transactions-4.0.4.jar.3144743539643303549.jar:?]
|
|
\tat com.atomikos.icatch.imp.TransactionServiceImp$1.alarm(TransactionServiceImp.java:471) [transactions-4.0.4.jar.3144743539643303549.jar:?]
|
|
\tat com.atomikos.timing.PooledAlarmTimer.notifyListeners(PooledAlarmTimer.java:95) [atomikos-util-4.0.4.jar.3934559012129936607.jar:?]
|
|
\tat com.atomikos.timing.PooledAlarmTimer.run(PooledAlarmTimer.java:82) [atomikos-util-4.0.4.jar.3934559012129936607.jar:?]
|
|
\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131]
|
|
\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131]
|
|
\tat java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
|
|
''')
|
|
assert threads.size() <= 1
|
|
}
|
|
|
|
void "test yourkit threads with indented names"() {
|
|
String text = '''
|
|
|
|
|
|
Stacks at 2017-07-13 07:15:35 AM (uptime 1d 2h 59m 6 sec) Threads shown: 3 of 55
|
|
|
|
|
|
ApplicationImpl pooled thread 1007 [RUNNABLE] [DAEMON]
|
|
org.iq80.snappy.SnappyDecompressor.decompressAllTags(byte[], int, int, byte[], int) SnappyDecompressor.java:182
|
|
org.iq80.snappy.SnappyDecompressor.uncompress(byte[], int, int) SnappyDecompressor.java:47
|
|
org.iq80.snappy.Snappy.uncompress(byte[], int, int) Snappy.java:85
|
|
com.intellij.util.CompressionUtil.readCompressedWithoutOriginalBufferLength(DataInput) CompressionUtil.java:111
|
|
|
|
|
|
AWT-EventQueue-0 2017.3#IC-173.SNAPSHOT IDEA, eap:true, os:Linux 3.13.0-117-generic, java-version:JetBrains s.r.o 1.8.0_152-release-867-b1 [WAITING]
|
|
java.util.concurrent.locks.LockSupport.parkNanos(Object, long) LockSupport.java:215
|
|
com.intellij.openapi.application.impl.ReadMostlyRWLock.writeLock() ReadMostlyRWLock.java:192
|
|
com.intellij.openapi.application.impl.ApplicationImpl.startWrite(Class) ApplicationImpl.java:1219
|
|
com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(Runnable) ApplicationImpl.java:1027
|
|
|
|
|
|
'''
|
|
def threads = ThreadDumpParser.parse(text)
|
|
assert threads.collect { it.name } == ['ApplicationImpl pooled thread 1007',
|
|
'AWT-EventQueue-0 2017.3#IC-173.SNAPSHOT IDEA, eap:true, os:Linux 3.13.0-117-generic, java-version:JetBrains s.r.o 1.8.0_152-release-867-b1']
|
|
}
|
|
|
|
void "test jstack -F format"() {
|
|
String text = '''
|
|
Attaching to process ID 7370, please wait...
|
|
Debugger attached successfully.
|
|
Server compiler detected.
|
|
JVM version is 25.161-b12
|
|
Deadlock Detection:
|
|
|
|
No deadlocks found.
|
|
|
|
Thread 8393: (state = BLOCKED)
|
|
- sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
|
|
- java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) @bci=63, line=215 (Compiled frame)
|
|
- java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(java.util.concurrent.SynchronousQueue$TransferStack$SNode, boolean, long) @bci=283, line=460 (Compiled frame)
|
|
- java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.lang.Object, boolean, long) @bci=175, line=362 (Compiled frame)
|
|
- java.util.concurrent.SynchronousQueue.poll(long, java.util.concurrent.TimeUnit) @bci=49, line=941 (Compiled frame)
|
|
- java.util.concurrent.ThreadPoolExecutor.getTask() @bci=247, line=1073 (Compiled frame)
|
|
- java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=74, line=1134 (Interpreted frame)
|
|
- java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=28, line=624 (Interpreted frame)
|
|
- java.lang.Thread.run() @bci=34, line=748 (Interpreted frame)
|
|
|
|
|
|
Thread 7399: (state = IN_NATIVE)
|
|
- sun.awt.X11.XToolkit.$$YJP$$waitForEvents(long) @bci=0 (Compiled frame; information may be imprecise)
|
|
- sun.awt.X11.XToolkit.waitForEvents(long) @bci=14 (Compiled frame)
|
|
- sun.awt.X11.XToolkit.run(boolean) @bci=298, line=568 (Interpreted frame)
|
|
- sun.awt.X11.XToolkit.run() @bci=38, line=532 (Interpreted frame)
|
|
- java.lang.Thread.run() @bci=34, line=748 (Interpreted frame)
|
|
|
|
|
|
Thread 7381: (state = BLOCKED)
|
|
'''
|
|
def threads = ThreadDumpParser.parse(text)
|
|
assert threads.collect { it.name } == ['8393', '7399', '7381']
|
|
assert threads[0].stackTrace.contains('ThreadPoolExecutor')
|
|
assert threads[1].stackTrace.contains('XToolkit')
|
|
assert threads[2].emptyStackTrace
|
|
|
|
}
|
|
|
|
void 'test jdk 11 format'() {
|
|
String text = '''
|
|
"main" #1 prio=5 os_prio=0 cpu=171.88ms elapsed=101.93s tid=0x0000026392746000 nid=0x3bc4 runnable [0x000000d7ed0fe000]
|
|
java.lang.Thread.State: RUNNABLE
|
|
\tat java.io.FileInputStream.readBytes(java.base@11.0.2/Native Method)
|
|
\tat java.io.FileInputStream.read(java.base@11.0.2/FileInputStream.java:279)
|
|
\tat java.io.BufferedInputStream.fill(java.base@11.0.2/BufferedInputStream.java:252)
|
|
\tat java.io.BufferedInputStream.read(java.base@11.0.2/BufferedInputStream.java:271)
|
|
\t- locked <0x000000062181e298> (a java.io.BufferedInputStream)
|
|
\tat my.Endless.main(Endless.java:13)
|
|
\tat jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@11.0.2/Native Method)
|
|
\tat jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@11.0.2/NativeMethodAccessorImpl.java:62)
|
|
\tat jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@11.0.2/DelegatingMethodAccessorImpl.java:43)
|
|
\tat java.lang.reflect.Method.invoke(java.base@11.0.2/Method.java:566)
|
|
\tat com.intellij.rt.execution.application.AppMainV2.main(AppMainV2.java:131)
|
|
|
|
"Reference Handler" #2 daemon prio=10 os_prio=2 cpu=0.00ms elapsed=101.90s tid=0x00000263c01b5000 nid=0x34e4 waiting on condition [0x000000d7ed7fe000]
|
|
java.lang.Thread.State: RUNNABLE
|
|
\tat java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.2/Native Method)
|
|
\tat java.lang.ref.Reference.processPendingReferences(java.base@11.0.2/Reference.java:241)
|
|
\tat java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.2/Reference.java:213)
|
|
|
|
"Finalizer" #3 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=101.90s tid=0x00000263c01df000 nid=0x3ae4 in Object.wait() [0x000000d7ed8ff000]
|
|
java.lang.Thread.State: WAITING (on object monitor)
|
|
\tat java.lang.Object.wait(java.base@11.0.2/Native Method)
|
|
\t- waiting on <0x0000000621808f10> (a java.lang.ref.ReferenceQueue$Lock)
|
|
\tat java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:155)
|
|
\t- waiting to re-lock in wait() <0x0000000621808f10> (a java.lang.ref.ReferenceQueue$Lock)
|
|
\tat java.lang.ref.ReferenceQueue.remove(java.base@11.0.2/ReferenceQueue.java:176)
|
|
\tat java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.2/Finalizer.java:170)
|
|
|
|
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=101.89s tid=0x00000263c0236800 nid=0x3cac runnable [0x0000000000000000]
|
|
java.lang.Thread.State: RUNNABLE
|
|
'''
|
|
|
|
def threads = ThreadDumpParser.parse(text)
|
|
assert threads.size() == 4
|
|
}
|
|
|
|
@CompileStatic
|
|
void "test very long line parsing performance"() {
|
|
def spaces = ' ' * 1_000_000
|
|
def letters = 'a' * 1_000_000
|
|
PlatformTestUtil.startPerformanceTest('parsing spaces', 100, {
|
|
def threads = ThreadDumpParser.parse(spaces)
|
|
assert threads.empty
|
|
}).assertTiming()
|
|
PlatformTestUtil.startPerformanceTest('parsing letters', 100, {
|
|
def threads = ThreadDumpParser.parse(letters)
|
|
assert threads.empty
|
|
}).assertTiming()
|
|
}
|
|
|
|
}
|