/*
* Copyright ( c ) 2002 , 2021 , Oracle and / or its affiliates . All rights reserved .
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
*
* This code is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 only , as
* published by the Free Software Foundation .
*
* This code is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* version 2 for more details ( a copy is included in the LICENSE file that
* accompanied this code ) .
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work ; if not , write to the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA .
*
* Please contact Oracle , 500 Oracle Parkway , Redwood Shores , CA 94065 USA
* or visit www . oracle . com if you need additional information or have any
* questions .
*/
package lib.jdb;
import java.io.File;
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* Represents list of commands of < code > jdb < / code > from JDK1 . 4 :
*
* run [ class [ args ] ] - - start execution of application ' s main class
*
* threads [ threadgroup ] - - list threads
* thread < thread id > - - set default thread
* suspend [ thread id ( s ) ] - - suspend threads ( default : all )
* resume [ thread id ( s ) ] - - resume threads ( default : all )
* where [ thread id ] | all - - dump a thread ' s stack
* wherei [ thread id ] | all - - dump a thread ' s stack , with pc info
* up [ n frames ] - - move up a thread ' s stack
* down [ n frames ] - - move down a thread ' s stack
* kill < thread > < expr > - - kill a thread with the given exception object
* interrupt < thread > - - interrupt a thread
*
* print < expr > - - print value of expression
* dump < expr > - - print all object information
* eval < expr > - - evaluate expression ( same as print )
* set < lvalue > = < expr > - - assign new value to field / variable / array element
* locals - - print all local variables in current stack frame
*
* classes - - list currently known classes
* class < class id > - - show details of named class
* methods < class id > - - list a class ' s methods
* fields < class id > - - list a class ' s fields
*
* threadgroups - - list threadgroups
* threadgroup < name > - - set current threadgroup
*
* stop in < class id > . < method > [ ( argument_type , . . . ) ]
* - - set a breakpoint in a method
* stop at < class id > : < line > - - set a breakpoint at a line
* clear < class id > . < method > [ ( argument_type , . . . ) ]
* - - clear a breakpoint in a method
* clear < class id > : < line > - - clear a breakpoint at a line
* clear - - list breakpoints
* catch < class id > - - break when specified exception thrown
* ignore < class id > - - cancel ' catch ' for the specified exception
* watch [ access | all ] < class id > . < field name >
* - - watch access / modifications to a field
* unwatch [ access | all ] < class id > . < field name >
* - - discontinue watching access / modifications to a field
* trace methods [ thread ] - - trace method entry and exit
* untrace methods [ thread ] - - stop tracing method entry and exit
* step - - execute current line
* step up - - execute until the current method returns to its caller
* stepi - - execute current instruction
* next - - step one line ( step OVER calls )
* cont - - continue execution from breakpoint
*
* list [ line number | method ] - - print source code
* use ( or sourcepath ) [ source file path ]
* - - display or change the source path
* exclude [ class id . . . | " none " ]
* - - do not report step or method events for specified classes
* classpath - - print classpath info from target VM
*
* monitor < command > - - execute command each time the program stops
* monitor - - list monitors
* unmonitor < monitor # > - - delete a monitor
* read < filename > - - read and execute a command file
*
* lock < expr > - - print lock info for an object
* threadlocks [ thread id ] - - print lock info for a thread
*
* pop - - pop the stack through and including the current frame
* reenter - - same as pop , but current frame is reentered
* redefine < class id > < class file name >
* - - redefine the code for a class
*
* disablegc < expr > - - prevent garbage collection of an object
* enablegc < expr > - - permit garbage collection of an object
*
* ! ! - - repeat last command
* < n > < command > - - repeat command n times
* help ( or ? ) - - list commands
* version - - print version information
* exit ( or quit ) - - exit debugger
*
* < class id > : full class name with package qualifiers or a
* pattern with a leading or trailing wildcard ( ' * ' ) .
* < thread id > : thread number as reported in the ' threads ' command
* < expr > : a Java ( tm ) Programming Language expression .
* Most common syntax is supported .
*
* Startup commands can be placed in either " jdb . ini " or " . jdbrc "
* in user . home or user . dir
*/
public class JdbCommand {
final String cmd;
boolean allowExit = false ;
// Default pattern to wait for command to complete
Pattern waitForPattern = Jdb.PROMPT_REGEXP;
public JdbCommand(String cmd) {
this .cmd = cmd;
}
public JdbCommand allowExit() {
allowExit = true ;
return this ;
}
public JdbCommand waitForPrompt(String pattern, boolean isMultiline) {
waitForPattern = Pattern.compile(pattern, isMultiline ? Pattern.MULTILINE : 0 );
return this ;
}
public static JdbCommand run(String ... params) {
return new JdbCommand("run " + Arrays.stream(params).collect(Collectors.joining(" " )));
}
public static JdbCommand cont() {
return new JdbCommand("cont" );
}
public static JdbCommand dump(String what) {
return new JdbCommand("dump " + what);
}
public static JdbCommand quit() {
// the command suppose jdb terminates
return new JdbCommand("quit" ).allowExit();
}
public static JdbCommand stopAt(String targetClass, int lineNum) {
return new JdbCommand("stop at " + targetClass + ":" + lineNum);
}
public static JdbCommand stopThreadAt(String targetClass, int lineNum) {
return new JdbCommand("stop thread at " + targetClass + ":" + lineNum);
}
public static JdbCommand stopGoAt(String targetClass, int lineNum) {
return new JdbCommand("stop go at " + targetClass + ":" + lineNum);
}
public static JdbCommand stopIn(String targetClass, String methodName) {
return new JdbCommand("stop in " + targetClass + "." + methodName);
}
public static JdbCommand stopInThreadid(String targetClass, String methodName, String threadid) {
return new JdbCommand("stop " + threadid + " in " + targetClass + "." + methodName);
}
public static JdbCommand thread (int threadNumber) {
return new JdbCommand("thread " + threadNumber);
}
// clear <class id>:<line> -- clear a breakpoint at a line
public static JdbCommand clear(String targetClass, int lineNum) {
return new JdbCommand("clear " + targetClass + ":" + lineNum);
}
// exception type used by catch/ignore
public enum ExType{
uncaught,
caught,
all
}
public static JdbCommand catch_(String classId) {
return new JdbCommand("catch " + classId);
}
public static JdbCommand catch_(ExType eType, String classId) {
return catch_(eType.toString() + " " + classId);
}
public static JdbCommand ignore(String classId) {
return new JdbCommand("ignore " + classId);
}
public static JdbCommand ignore(ExType eType, String classId) {
return ignore(eType.toString() + " " + classId);
}
public static JdbCommand step() {
return new JdbCommand("step" );
}
public static JdbCommand stepUp() {
return new JdbCommand("step up" );
}
public static JdbCommand next() {
return new JdbCommand("next" );
}
// where [thread id] | all
public static JdbCommand where(String threadId) {
return new JdbCommand("where " + threadId);
}
public static JdbCommand eval(String expr) {
return new JdbCommand("eval " + expr);
}
public static JdbCommand print(String expr) {
return new JdbCommand("print " + expr);
}
public static JdbCommand locals() {
return new JdbCommand("locals" );
}
public static JdbCommand set(String lvalue, String expr) {
return new JdbCommand("set " + lvalue + " = " + expr);
}
public static JdbCommand lock(String expr) {
return new JdbCommand("lock " + expr);
}
public static JdbCommand methods(String classId) {
return new JdbCommand("methods " + classId);
}
public static JdbCommand threads() {
return new JdbCommand("threads" );
}
// trace [go] methods [thread]
// -- trace method entries and exits.
// -- All threads are suspended unless 'go' is specified
// trace [go] method exit | exits [thread]
// -- trace the current method's exit, or all methods' exits
// -- All threads are suspended unless 'go' is specified
// untrace [methods] -- stop tracing method entrys and/or exits
public static JdbCommand trace(boolean go, String mode, Integer threadId) {
return new JdbCommand(" trace"
+ (go ? " go" : "" )
+ (mode != null ? " " + mode : "" )
+ (threadId != null ? " " + threadId.toString() : "" ));
}
// prints trace status
public static JdbCommand trace() {
return trace(false , null , null );
}
public static JdbCommand traceMethods(boolean go, Integer threadId) {
return trace(go, "methods" , threadId);
}
public static JdbCommand traceMethodExit(boolean go, Integer threadId) {
return trace(go, "method exit" , threadId);
}
public static JdbCommand traceMethodExits(boolean go, Integer threadId) {
return trace(go, "method exits" , threadId);
}
public static JdbCommand untrace() {
return new JdbCommand("untrace" );
}
// watch [access|all] <class id>.<field name>
public static JdbCommand watch(String classId, String fieldName) {
return new JdbCommand("watch " + classId + "." + fieldName);
}
public static JdbCommand pop() {
return new JdbCommand("pop" );
}
public static JdbCommand redefine(String classId, String classFileName) {
return new JdbCommand("redefine " + classId + " " + classFileName);
}
public static JdbCommand use(String... sourcePath) {
return new JdbCommand("use " + String.join(File.pathSeparator, sourcePath));
}
}
Messung V0.5 in Prozent C=89 H=84 G=86
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland