我正在学习JDB,并且遇到了一些悖论。在启动JDB(带有“jdb ClassName”)之后,大多数教程将告诉我键入
查看可用方法的列表,以便我可以设置断点。如果我这样做,JDB会回复
当然,如果我在设置任何断点之前说“运行”,它将直接运行。不是很有帮助。我唯一可以得出的结论是,jdb希望您将断点设置为盲点,但这似乎是一个粗略的疏忽,我坚持认为我只是缺少一个命令。
非常感谢!!
乔伊斯
最佳答案
注意,有两种创建调试 session 的方法(请参阅jdb documentation)。
在一个终端 session 中进行
java -Xdebug -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y ClassName
jdb -attach 8000
单个终端 session 中的
jdb ClassName
如果要附加,则无需使用
run
命令。但是,如果要启动,则和需要使用
run
命令(尚未启动虚拟机)。可以从
man jdb
推断出这种行为:这就是为什么您会收到错误消息。您启动了调试器,但未使用
run command
。一些教程可能会错误地告诉您启动jdb,但是忘记告诉您执行
run
命令。下面显示了如何获取方法列表(假设您在名为
main
的类中具有ClassName
方法)。jdb -attach 8000
main[1] stop in ClassName.main
main[1] cont
main[1] methods ClassName
jdb ClassName
> stop in ClassName.main
> run
main[1] methods ClassName
提示:查看jdb的命令提示符。有时是
>
,有时是main[1]
。如果它是>
,则该虚拟机尚未启动,并且直到您使用了classes
命令后,诸如methods
,run
的命令才起作用。如果提示是main[1]
,则虚拟机已启动,所需命令将起作用。单独使用调试器很难设置breakboint。您需要在其他地方查看源代码。您可能会知道至少一个要中断的方法的名称,并因此使用以下方法设置初始断点
stop in ClassName.MethodName
。如果您不知道在哪里中断,则始终可以使用stop in ClassName.Main
在您的main方法上设置一个断点。请记住,在调试器运行时,您可以设置更多的断点。另外,您可能会发现
list
命令很有用-它显示了与当前断点匹配的源代码。关于java - JDB-在运行程序之前如何获取方法列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3273286/