Указывая sourcepath в jdb, что я делаю не так?
У меня есть проект Java, в котором файловая система выглядит следующим образом: у меня есть 3 каталога: bin, src и lib src содержит мои файлы.java bin содержит мои файлы.class (скомпилированные с использованием файлов в src) lib содержит несколько файлов.jar файлы, импортированные большинством файлов src
Я учусь использовать jdb, но каждый раз, когда я пытаюсь использовать команду list, он просто говорит, что исходный файл не может быть найден, я запускаю следующую команду из моего каталога bin:
jdb -classpath../lib/*:. -sourcepath../src envelope.Envelope
где мой метод main содержится в классе Envelope, который является частью пакета envelope, что я делаю не так?
3 ответа
Я знаю, что это очень старый, но, возможно, кто-то еще будет заинтересован в этом
Допустим, у нас есть файл
package mypackage;
public class Main {
public static void main(String [] arg) {
System.out.println("Hello world");
}
}
и макет проекта следует
jdb_test/
├── src
│ └── mypackage
│ └── Main.java
└── target
└── mypackage
└── Main.class
файл класса был скомпилирован с использованием:
javac -sourcepath src -d target src/mypackage/Main.java
# if you have multiple files, you can always do
find . -name "*.java" -exec javac -sourcepath src -d target {} \;
Затем, находясь внутри директории jdb_test, мы можем вызвать
jdb -sourcepath src -classpath target mypackage.Main
и отладить код
Initializing jdb ...
> stop in mypackage.Main.main
Deferring breakpoint mypackage.Main.main.
It will be set after the class is loaded.
> run
run mypackage.Main
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
>
VM Started: Set deferred breakpoint mypackage.Main.main
Breakpoint hit: "thread=main", mypackage.Main.main(), line=5 bci=0
5 System.out.println("Hello world");
main[1] list
1 package mypackage;
2
3 public class Main {
4 public static void main(String [] arg) {
5 => System.out.println("Hello world");
6 }
7 }
main[1]
Я столкнулся с той же проблемой, что и SO, и в дополнение к предоставленному решению, я хочу отметить, вам нужно выполнить JDB из правильного каталога. Если ваш класс принадлежит какому-либо пакету, например classMainActivity
принадлежит пакетуorg.gradle.samples
, то папка вашего проекта содержит следующий каталог:
yourProject/
├── src
│ └── main
│ └── java
│ └── org
│ └── gradle
│ └── samples
│ └── MainActivity.java
Затем вы должны выполнитьjdb
откуда , где JDB<pathToYourProject>/src/main/java
также.
The list
команда не будет работать, если вы выполняете JDB из другого места, даже если вы определили правильный-sourcepath
. Или даже если вы измените исходный путь в консоли JDB черезuse
команда.
Существует альтернативный способ «на лету».
«sourcepath» также является командой внутри самой jdb. Итак, допустим, вы уже подключили/установили точку останова/запуска, получаете эту ошибку и не хотите начинать заново.
Просто введитеsourcepath /path/to/srcdir
и он должен быть счастлив с этого момента.