2010-07-17 67 views
7

我在学习JDB,遇到了一个悖论。加多宝开始后(用“加多宝类名”)最教程将告诉我键入JDB - 如何在运行程序之前获取方法列表?

>方法的类名

看到可用的方法列表,这样我就可以把我的断点。如果我这样做,加多宝回复

命令“方法”直到虚拟机开始使用“运行”命令

当然是无效的,如果我说“跑”设置任何断点前,它贯穿始终;不是很有帮助。我唯一可以断定的是,jdb希望你能够盲目设置你的断点,但是这看起来像是一种粗暴的疏忽,我坚持认为我只是缺少一个命令。

非常感谢! 乔伊斯

+0

为什么你不能使用IDE? – 2010-07-18 17:46:22

回答

1

如果你正在调试你自己的程序,我想你会知道类名!

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

但事实上你正在运行jdb ClassName,所以你知道你会跑法ClassName.main()。对?

如果它是一个web服务中的servlet,那么servlet的类是web.xml

所以在任何这些情况下,你至少应该能够得到第一种方法。一旦到了,你可以找到其余的。

0

我有完全相同的问题。

运行后,所以说:

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   
1

注意,有方法来创建一个调试会话(见jdb documentation)。

  1. 附加 - 我们的程序加载到虚拟机时,它会暂停的端口(例如8000)上侦听。然后在另一个终端会话中,我们加载jdb并通过指定端口将其附加到JVM会话。
    • 在一个termial会话:java -Xdebug -agentlib:jdwp=transport=dt_socket, address=8000,server=y,suspend=y ClassName
    • 在第二终端会话
    • jdb -attach 8000
  2. 启动 - 负载JDB并告诉它的类的名称来加载。
    • 在一个终端会话:jdb ClassName

如果您连接,那么你就需要使用run命令。
但是,如果你是推出,那么你需要使用run命令(虚拟机尚未启动)。


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

运行 - 开始jdb,并设置必要的断点后,使用此 命令来启动调试应用程序的执行。 只有当jdb启动调试应用程序 (而不是附加到现有VM)时,此 命令才可用。

这就是为什么你有错误信息。你推出调试器,但没有使用run command。 有些教程可能会错误地告诉你启动 jdb,但忘记告诉你执行run命令。


下面说明如何获取的方法列表(假设你有一个名为ClassNamemain方法)。

  1. 附加
    jdb -attach 8000
    main[1] stop in ClassName.main
    main[1] cont
    main[1] methods ClassName

  2. 启动
    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命令很有用 - 它显示了与当前断点命中对应的源代码。

相关问题