文件名以 .class 结尾的文件
文件名以 .jar 结尾的文件
使用包装器启动的 Java 应用程序
在调试模式下启动并连接了 dbx 的运行的 Java 应用程序
使用 JNI_CreateJavaVM 接口嵌入 Java 应用程序的 C 应用程序或 C++ 应用程序
在上述所有情况下,dbx 均可识别其正在调试的是 Java 应用程序。
可以使用 dbx 调试文件扩展名为 .class 的文件,如下例所示。
(dbx) debug myclass.class |
如果定义应用程序的类在包中定义,便需要如同在 JVM 软件上运行应用程序那样加入包的路径,如下例所示。
(dbx) debug java.pkg.Toy.class |
也可以使用类文件的全路径名。dbx 通过在 .class 文件中进行查找来自动确定类路径的软件包部分,然后将全路径名的剩余部分添加到类路径中。例如,假定有以下路径名,dbx 会确定 pkg/Toy.class 是主类名,然后将 /home/user/java 添加到类路径中。
(dbx) debug /home/user/java/pkg/Toy.class |
Java 应用程序可以使用 JAR(Java 归档)文件打包。可以使用 dbx 调试 JAR 文件,如下例所示。
(dbx) debug myjar.jar |
开始调试文件名以 .jar 结尾的文件时,dbx 会使用在此 JAR 文件的清单中指定的 Main_Class 属性来确定主类。(主类是 JAR 文件内作为应用程序入口点的类。)如果使用全路径名或相对路径名来指定 JAR 文件,dbx 会使用目录名,并在 Main-Class 属性中将其作为类路径的前缀。
如果调试无 Main-Class 属性的 JAR 文件,可以使用 JAR URL 语法 jar:<url>!/{entry}(在 Java 2 平台标准版的 JarURLConnection 类中指定)来指定主类的名称,如以下示例所示。
(dbx) debug jar:myjar.jar!/myclass.class (dbx) debug jar:/a/b/c/d/e.jar!/x/y/z.class (dbx) debug jar:file:/a/b/c/d.jar!/myclass.class |
对于这些示例中的每一个示例,dbx 都会执行以下操作:
将 ! 字符后指定的类路径作为主类(例如,/myclass.class 或 /x/y/z.class)来处理
将 JAR 文件名 ./myjar.jar、/a/b/c/d/e.jar 或 /a/b/c/d.jar 添加到类路径中
开始调试主类
如果使用 jvm_invocation 环境变量指定了 JVM 软件的定制启动(请参见定制 JVM 软件的启动),则不会将 JAR 文件名自动添加到类路径中。在这种情况下,必须在开始调试时将 JAR 文件名添加到类路径中。
Java 应用程序通常有一个用于设置环境变量的包装器。如果 Java 应用程序有包装器,需要通过设置 jvm_invocation 环境变量将要使用包装器脚本这一情况告知 dbx(请参见定制 JVM 软件的启动)。
可以将 dbx 连接到正在运行的 Java 应用程序,前提是在启动该应用程序时指定了下例所示的选项。启动应用程序后,可以将 dbx 命令(请参见dbx 命令) 与正在运行的 Java 进程的进程 ID 结合使用以开始调试。
$ java -Djava.compiler=NONE -Xdebug -Xnoagent -Xrundbx_agent myclass.class $ dbx - 2345 |
为了使 JVM 软件能够找到 libdbx_agent.so,需要在运行 Java 应用程序前将适当路径添加到 LD_LIBRARY_PATH 中:
如果在运行 Solaris OS 的系统上使用 32 位版本的 JVM 软件,则添加 /installation_directory/SUNWspro/lib/libdbx_agent.so。
如果在运行 Solaris OS 且基于 SPARC 的系统上使用 64 位版本的 JVM 软件,则将 /installation_directory/SUNWspro/lib/v9/libdbx_agent.so 添加至 LD_LIBRARY_PATH。
如果在运行 Linux OS 且基于 x64 的系统上使用 64 位版本的 JVM 软件,则将 /installation_directory/sunstudio12/lib/amd64/libdbx_agent.so 添加至 LD_LIBRARY_PATH。
installation_directory 是 Sun Studio 软件的安装位置。
将 dbx 连接到正在运行的应用程序时,dbx 会以 Java 模式开始调试应用程序。
如果 Java 应用程序需要 64 位目标库,请在启动应用程序时包括 -d64 选项。之后,将 dbx 连接到应用程序时,dbx 将使用运行该应用程序的 64 位 JVM 软件。
$ java -Djava.compiler=NONE -Xdebug -Xnoagent -Xrundbx_agent -d64 myclass.class $ dbx - 2345 |
可以使用 JNI_CreateJavaVM 接口调试内嵌 Java 应用程序的 C 应用程序或 C++ 应用程序。C 应用程序或 C++ 应用程序必须通过为 JVM 软件指定以下选项,才能启动 Java 应用程序:
-Xdebug -Xnoagent -Xrundbx_agent |
为了使 JVM 软件能够找到 libdbx_agent.so,需要在运行 Java 应用程序前将适当路径添加到 LD_LIBRARY_PATH 中:
如果在运行 Solaris OS 的系统上使用 32 位版本的 JVM 软件,则将 /installation_directory/SUNWspro/lib/libdbx_agent.so 添加至 LD_LIBRARY_PATH。
如果在运行 Solaris OS 且基于 SPARC 的系统上使用 64 位版本的 JVM 软件,则将 /installation_directory/SUNWspro/lib/v9/libdbx_agent.so 添加至 LD_LIBRARY_PATH。
如果在运行 Linux OS 且基于 x64 的系统上使用 64 位版本的 JVM 软件,则将 /installation_directory/sunstudio12/lib/amd64/libdbx_agent.so 添加至 LD_LIBRARY_PATH。
installation_directory 是 Sun Studio 软件的安装位置。
在 Java 模式下使用 run 命令时,会将提供的参数传递给应用程序,而非 JVM 软件。要将参数传递给 JVM 软件,请参见定制 JVM 软件的启动。
有时 Java 源文件与 .class 或 .jar 文件不在同一目录中。可以使用 $JAVASRCPATH 环境变量指定 dbx 查找 Java 源文件的目录。例如,JAVASRCPATH=.:/mydir/mysrc:/mydir/mylibsrc:/mydir/myutils 会使 dbx 在与正被调试的类文件对应的源文件的列出目录中查找。
在以下情况下,dbx 可能找不到 C 源文件或 C++ 源文件:
如果源文件不在编译时所在的位置
如果编译源文件的系统与运行 dbx 的系统不同,而且编译目录的路径名不同
在此类情况下,请使用 pathmap 命令(请参见pathmap 命令)将一个路径名映射到另一个路径名,以便 dbx 可以找到您的文件。
应用程序可以有从可能不属于常规类路径的位置装入类文件的定制类加载器。在这种情况下,dbx 找不到类文件。使用环境变量 CLASSPATHX 可以为 dbx 指定由定制类加载器装入的类文件的路径。例如,CLASSPATHX=.:/myloader/myclass:/mydir/mycustom 会使 dbx 在尝试查找类文件时到列出的目录中查找。
与本地应用程序不同,Java 应用程序不包含便于访问的名称索引。因此不能简单地键入:
(dbx) stop in myMethod |
而是需要使用方法的完整路径:
(dbx) stop in com.any.library.MyClass.myMethod |
使用 MyClass 的某个方法停止时是一种例外情况,在这种情况下,使用 myMethod 就应足可以了。
避免包含该方法的完整路径的一种方式是,使用 stop inmethod:
(dbx) stop inmethod myMethod |
但是这样做可能会导致在多个方法名称 myMethod 中停止。
包含 JNI C 或 C++ 代码的共享库由 JVM 动态装入,在这些库中设置断点需要一些其他步骤。有关更多信息,请参见在动态装入的库中设置断点。