我正在学习JDB,并且遇到了一些悖论。在启动JDB(带有“jdb ClassName”)之后,大多数教程将告诉我键入



查看可用方法的列表,以便我可以设置断点。如果我这样做,JDB会回复



当然,如果我在设置任何断点之前说“运行”,它将直接运行。不是很有帮助。我唯一可以得出的结论是,jdb希望您将断点设置为盲点,但这似乎是一个粗略的疏忽,我坚持认为我只是缺少一个命令。

非常感谢!!
乔伊斯

最佳答案

注意,有两种创建调试 session 的方法(请参阅jdb documentation)。

  • 附加-我们将程序加载到虚拟机中,它会暂停监听端口(例如8000)。然后,在另一个终端 session 中,我们通过指定端口加载jdb并将其附加到JVM session 。

    在一个终端 session 中进行
  • :java -Xdebug -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y ClassName
  • 在第二个终端 session 中的
  • :jdb -attach 8000
  • 启动-加载jdb并告诉它要加载的类的名称。

    单个终端 session 中的
  • :jdb ClassName

  • 如果要附加,则无需使用run命令。
    但是,如果要启动,则需要使用run命令(尚未启动虚拟机)。

    可以从man jdb推断出这种行为:



    这就是为什么您会收到错误消息。您启动了调试器,但未使用run command
    一些教程可能会错误地告诉您启动jdb,但是忘记告诉您执行run命令。

    下面显示了如何获取方法列表(假设您在名为main的类中具有ClassName方法)。
  • 附加:jdb -attach 8000main[1] stop in ClassName.mainmain[1] contmain[1] methods ClassName
  • 启动:jdb ClassName> stop in ClassName.main> runmain[1] methods ClassName

  • 提示:查看jdb的命令提示符。有时是>,有时是main[1]。如果它是>,则该虚拟机尚未启动,并且直到您使用了classes命令后,诸如methodsrun的命令才起作用。如果提示是main[1],则虚拟机已启动,所需命令将起作用。



    单独使用调试器很难设置breakboint。您需要在其他地方查看源代码。您可能会知道至少一个要中断的方法的名称,并因此使用以下方法设置初始断点stop in ClassName.MethodName。如果您不知道在哪里中断,则始终可以使用stop in ClassName.Main在您的main方法上设置一个断点。
    请记住,在调试器运行时,您可以设置更多的断点。另外,您可能会发现list命令很有用-它显示了与当前断点匹配的源代码。

    关于java - JDB-在运行程序之前如何获取方法列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3273286/

    10-10 17:39