Указывая 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и он должен быть счастлив с этого момента.

Другие вопросы по тегам