Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDB——如何在运行程序之前获取方法列表?_Java_Debugging_Jdb - Fatal编程技术网

Java JDB——如何在运行程序之前获取方法列表?

Java JDB——如何在运行程序之前获取方法列表?,java,debugging,jdb,Java,Debugging,Jdb,我正在学习JDB,遇到了一点矛盾。在启动JDB(使用“JDB类名”)之后,大多数教程都会告诉我如何键入 >方法类名称 查看可用方法的列表,以便设置断点。如果我这样做,JDB会回答 在使用“run”命令启动VM之前,命令“methods”无效 当然,如果我在设置断点之前说“run”,它会直接运行;不是很有帮助。我唯一能得出的结论是,jdb希望您将断点设置为盲,但这似乎是一个严重的疏忽,我坚持认为我只是缺少了一个命令 非常感谢!! 乔伊斯如果你调试的是你自己的程序,我想你应该知道类名 如果它是一个没

我正在学习JDB,遇到了一点矛盾。在启动JDB(使用“JDB类名”)之后,大多数教程都会告诉我如何键入

>方法类名称

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

在使用“run”命令启动VM之前,命令“methods”无效

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

非常感谢!!
乔伊斯

如果你调试的是你自己的程序,我想你应该知道类名

如果它是一个没有源代码的程序,那么要运行它,必须知道包含
main()
的类名。如果它位于以
java-jar
开头的jar中,则该类的名称位于jar内的清单中

但实际上您正在运行
jdbclassname
,所以您知道您将运行方法
ClassName.main()
。对吧?

如果它是web服务中的servlet,则servlet的类位于
web.xml


所以在这些情况下,你至少应该能够得到第一种方法。到了那里,你就可以找到剩下的了。

我也有同样的问题

因此,在运行之后:

jdb -classpath build -sourcepath src MyClass
jdb
会话中,我输入的文本以粗体显示:

> stop in MyClass.main Deferring breakpoint MyClass.main. It will be set after the class is loaded. > run run MyClass Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable > VM Started: Set deferred breakpoint MyClass.main Breakpoint hit: "thread=main", MyClass.main(), line=798 bci=0 798 MyClass singleton = new MyClass(); main[1] list 797 public static void main(String[] args) { 798 => MyClass singleton = new MyClass(); 799 >在MyClass.main中停止 延迟断点MyClass.main。 它将在类加载后设置。 >跑 运行MyClass 设置未捕获的java.lang.Throwable 设置延迟未捕获java.lang.Throwable > VM已启动:设置延迟断点MyClass.main 断点命中:“thread=main”,MyClass.main(),line=798 bci=0 798 MyClass singleton=新MyClass(); 主要[1]列表 797公共静态void main(字符串[]args){ 798=>MyClass singleton=newmyclass(); 799 请注意,有两种方法可以创建调试会话(请参阅)

  • 附加-我们将程序加载到虚拟机中,它暂停监听端口(例如8000)。然后在另一个终端会话中,我们加载jdb并通过指定端口将其附加到JVM会话。
    • 在一个术语会话中:
      java-Xdebug-agentlib:jdwp=transport=dt_socket,
      地址=8000,服务器=y,挂起=y类名称
    • 在第二个终端会话中:
      jdb-attach8000
  • 启动-加载jdb并告诉它要加载的类的名称。
    • 在单个终端会话中:
      jdb ClassName
  • 如果正在连接,则不需要使用
    run
    命令。
    但是,如果要启动,则需要使用
    run
    命令(虚拟机尚未启动)


    这种行为可以从
    manjdb
    中推断出来:

    跑步- 启动
    jdb
    并设置任何必要的断点后,使用 命令启动已调试应用程序的执行。此 命令仅在
    jdb
    启动已调试的应用程序时可用 (与连接到现有VM不同)

    这就是出现错误消息的原因。您启动了调试器,但没有使用
    run命令
    。 有些教程可能错误地告诉您启动jdb,但忘记告诉您执行
    run
    命令


    下面显示了如何获取方法列表(假设在名为
    ClassName
    的类中有
    main
    方法)

  • 附件:
    jdb-附加8000

    main[1]在ClassName.main中停止
    
    main[1]cont

    main[1]方法类名称

  • 启动:
    jdb类名

    >在ClassName.main中停止

    >运行

    main[1]方法类名称

  • 提示:查看jdb的命令提示符。有时它是
    ,有时它像
    main[1]
    。如果它是
    ,那么VM还没有启动,
    方法等命令在您使用
    运行
    命令之前不会工作。如果提示符是
    main[1]
    ,虚拟机已启动,所需命令将起作用


    我能得出的唯一结论是,jdb希望您将断点设置为盲

    单独使用调试器很难设置断点。您需要查看其他地方的源代码。您可能知道至少一个要中断的方法的名称,因此使用
    在ClassName.MethodName中停止。如果您不知道在哪里中断,您可以使用
    在ClassName.main中停止
    在主方法上设置断点。 请记住,在调试器运行时,您可以设置更多断点。此外,您可能会发现,
    list
    命令非常有用—它显示与当前断点命中相对应的源代码