jdb 可以杀死单个 java 线程吗?

问题描述 投票:0回答:3

理论上,JDB(java调试器)允许杀死单个线程。实践中,可能吗?这里我将 jdb 连接到我的 JVM,它在端口 8000 处有一个 agentlib:

$ jdb -attach 8000
> 

我列出了主题:

> threads
Group system:
  (java.lang ...
  [...]

我找到了有问题的线程并尝试杀死它:

> kill 0x21bb new java.lang.Exception("die!")
killing thead: pool-766-thread-1
> com.sun.tools.example.debug.expr.ParseException: Unable to create java.lang.Exception instance
Expression must evaluate to an object

所以线程不能被杀死?

如何在jdb中创建一个新的异常,并将其交给线程终止?

java multithreading exception kill jdb
3个回答
1
投票

以下对SO的回答似乎只是为了强制你的问题。

但是以下答案可能确实回答了您的问题...


0
投票

您可能还运行 jconsole/jvisualvm。我遇到了同样的问题,但后来我关闭了 jconsole,jdb Kill 命令起作用了。


0
投票

我想我知道你的问题是什么。您不能使用

kill
jdb
线程,除非首先将它们挂起。但 JVM 中的一件奇怪的事情是你无法挂起正在睡眠的线程。如果它是“正在运行(在断点处)”,这实际上也意味着暂停,那么它可以被杀死:

main[1] threads Group system: (java.lang.ref.Reference$ReferenceHandler)0x162 Reference Handler cond. waiting (java.lang.ref.Finalizer$FinalizerThread)0x161 Finalizer cond. waiting (java.lang.Thread)0x160 Signal Dispatcher running Group main: (java.lang.Thread)0x1 main running (at breakpoint) main[1] kill 0x1 new java.lang.Exception("die!") killing thread: main main[1] instance of java.lang.Thread(name='main', id=1) killed
OTOH,如果你试图杀死一个正在休眠的线程,那似乎是不可能的......

> threads Group system: (java.lang.ref.Reference$ReferenceHandler)0x162 Reference Handler cond. waiting (java.lang.ref.Finalizer$FinalizerThread)0x161 Finalizer cond. waiting (java.lang.Thread)0x160 Signal Dispatcher running Group main: (java.lang.Thread)0x1bf Thread-0 sleeping (java.lang.Thread)0x1c1 DestroyJavaVM running > kill 0x1bf new java.lang.Exception("die!") killing thread: Thread-0 > com.sun.tools.example.debug.expr.ParseException: Unable to create java.lang.Exception instance Expression must evaluate to an object > suspend All threads suspended. > kill 0x1bf new java.lang.Exception("die!") killing thread: Thread-0 > com.sun.tools.example.debug.expr.ParseException: Unable to create java.lang.Exception instance Expression must evaluate to an object > threads Group system: (java.lang.ref.Reference$ReferenceHandler)0x162 Reference Handler cond. waiting (java.lang.ref.Finalizer$FinalizerThread)0x161 Finalizer cond. waiting (java.lang.Thread)0x160 Signal Dispatcher running Group main: (java.lang.Thread)0x1bf Thread-0 sleeping (java.lang.Thread)0x1c1 DestroyJavaVM running >
另请注意,JDWP 特定线程

不能以这种方式被终止(通过 JDI,jdb

 也在下面使用),因为 
libjdwp
 会在请求时出错。鉴于您的示例中涉及的线程名称 
pool-766-thread-1
,我认为它不是那些(JDWP)线程之一。

© www.soinside.com 2019 - 2024. All rights reserved.