Java JDB——如何在运行程序之前获取方法列表?
我正在学习JDB,遇到了一点矛盾。在启动JDB(使用“JDB类名”)之后,大多数教程都会告诉我如何键入 >方法类名称 查看可用方法的列表,以便设置断点。如果我这样做,JDB会回答 在使用“run”命令启动VM之前,命令“methods”无效 当然,如果我在设置断点之前说“run”,它会直接运行;不是很有帮助。我唯一能得出的结论是,jdb希望您将断点设置为盲,但这似乎是一个严重的疏忽,我坚持认为我只是缺少了一个命令 非常感谢!!Java JDB——如何在运行程序之前获取方法列表?,java,debugging,jdb,Java,Debugging,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
请注意,有两种方法可以创建调试会话(请参阅)
- 在一个术语会话中:
java-Xdebug-agentlib:jdwp=transport=dt_socket, 地址=8000,服务器=y,挂起=y类名称
- 在第二个终端会话中:
jdb-attach8000
- 在单个终端会话中:
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]方法类名称
,有时它像main[1]
。如果它是
,那么VM还没有启动,类
,方法等命令在您使用运行命令之前不会工作。如果提示符是main[1]
,虚拟机已启动,所需命令将起作用
我能得出的唯一结论是,jdb希望您将断点设置为盲
单独使用调试器很难设置断点。您需要查看其他地方的源代码。您可能知道至少一个要中断的方法的名称,因此使用
在ClassName.MethodName中停止。如果您不知道在哪里中断,您可以使用在ClassName.main中停止
在主方法上设置断点。
请记住,在调试器运行时,您可以设置更多断点。此外,您可能会发现,list
命令非常有用—它显示与当前断点命中相对应的源代码