我在学习JDB,遇到了一个悖论。加多宝开始后(用“加多宝类名”)最教程将告诉我键入JDB - 如何在运行程序之前获取方法列表?
>方法的类名
看到可用的方法列表,这样我就可以把我的断点。如果我这样做,加多宝回复
命令“方法”直到虚拟机开始使用“运行”命令
当然是无效的,如果我说“跑”设置任何断点前,它贯穿始终;不是很有帮助。我唯一可以断定的是,jdb希望你能够盲目设置你的断点,但是这看起来像是一种粗暴的疏忽,我坚持认为我只是缺少一个命令。
非常感谢! 乔伊斯
我在学习JDB,遇到了一个悖论。加多宝开始后(用“加多宝类名”)最教程将告诉我键入JDB - 如何在运行程序之前获取方法列表?
>方法的类名
看到可用的方法列表,这样我就可以把我的断点。如果我这样做,加多宝回复
命令“方法”直到虚拟机开始使用“运行”命令
当然是无效的,如果我说“跑”设置任何断点前,它贯穿始终;不是很有帮助。我唯一可以断定的是,jdb希望你能够盲目设置你的断点,但是这看起来像是一种粗暴的疏忽,我坚持认为我只是缺少一个命令。
非常感谢! 乔伊斯
如果你正在调试你自己的程序,我想你会知道类名!
如果它是一个没有源代码的程序,那么要运行它,您必须知道类名包含main()
。如果它位于以java -jar
开头的罐子中,则该类的名称位于jar内的清单中。
但事实上你正在运行jdb ClassName
,所以你知道你会跑法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
注意,有方法来创建一个调试会话(见jdb documentation)。
java -Xdebug -agentlib:jdwp=transport=dt_socket, address=8000,server=y,suspend=y ClassName
jdb -attach 8000
jdb ClassName
如果您连接,那么你就需要使用run
命令。
但是,如果你是推出,那么你做需要使用run
命令(虚拟机尚未启动)。
这种行为可以从man jdb
推断:
运行 - 开始
jdb
,并设置必要的断点后,使用此 命令来启动调试应用程序的执行。 只有当jdb
启动调试应用程序 (而不是附加到现有VM)时,此 命令才可用。
这就是为什么你有错误信息。你推出调试器,但没有使用run command
。 有些教程可能会错误地告诉你启动 jdb,但忘记告诉你执行run
命令。
下面说明如何获取的方法列表(假设你有一个名为ClassName
类main
方法)。
附加:
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
提示:看加多宝的命令提示符。有时它是>
,有时它就像main[1]
。如果是>
,那么虚拟机尚未启动,并且在使用run
命令之前,命令(如classes
,methods
)将不起作用。如果提示是main[1]
,则虚拟机已启动并且所需的命令将起作用。
我可以断定,唯一的事情是,加多宝期待您设置断点盲目
这是很难单独使用调试器设置breakboints。你需要在别处查看你的源代码。您可能会知道至少一种方法的名称,并使用 stop in ClassName.MethodName
来设置初始断点。如果你不知道哪里可以破解,你总是可以使用stop in ClassName.Main
在你的主要方法上设置一个断点。 请记住,当调试器运行时,您可以设置更多的断点。另外,您可能会发现,list
命令很有用 - 它显示了与当前断点命中对应的源代码。
为什么你不能使用IDE? – 2010-07-18 17:46:22