Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Debug с заходом в Java.lang  [new]
faustgreen
Member

Откуда:
Сообщений: 318
Есть код:
package codePoint;

public class StringFromCodePoint {
	public static void main(String[] args) {
		
		// Russian letters.
		System.out.print("Russian letters: ");
		for (int i = 1040; i<=1103; i++)
			System.out.print(newString(i));
		
		System.out.println();
		
		// Chinese symbol.
		System.out.println("Chinese symbol: " + newString(37329));
		
		char c = 37329;
		System.out.println(c);
		
		// char c2 = 65536; Compile error char type is limited by 65535. 
		System.out.println("symbol: " + newString(2000000));
	}
	
	static String newString(int codePoint) {
	    if (Character.charCount(codePoint) == 1) {
	        return String.valueOf((char) codePoint);
	    } else {
	        return new String(Character.toChars(codePoint));
	    }
	}
	
}

// http://www.oracle.com/us/technologies/java/supplementary-142654.ht


При попытке его дебажить со строки
System.out.println("symbol: " + newString(2000000));
по шагам, курсор доходит до строки
return new String(Character.toChars(codePoint));
метода newString и выбрасывает ексепшн. При этом он не заходит в сам метод Character.toChars(codePoint), а в окне Debug пишет, что код не доступен.

Как сделать так, чтобы дебагер заходил в код класса Character (Примечание: source у меня приатачен и я могу видеть код метода Character.toChars по нажатию на нем Ctrl+click).

К сообщению приложен файл. Размер - 13Kb
19 фев 19, 22:33    [21814938]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
faustgreen
Member

Откуда:
Сообщений: 318
По самому коду вопросов нет, эксепшен вылетает из-за того что превышено максимальное значение codePoint, но до момента выброса исключения пробегается некоторый код:
    public static char[] toChars(int codePoint) {
        if (isBmpCodePoint(codePoint)) {
            return new char[] { (char) codePoint };
        } else if (isValidCodePoint(codePoint)) {
            char[] result = new char[2];
            toSurrogates(codePoint, result, 0);
            return result;
        } else {
            throw new IllegalArgumentException();
        }
    }
Вот по этому коду я и хочу пробежаться дебагером!
19 фев 19, 22:43    [21814941]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
faustgreen
Member

Откуда:
Сообщений: 318
Вообщем докопался:
Update the build path of the project to use a JDK instead of JRE.
JREs do not include debug information
(https://stackoverflow.com/questions/22205155/debug-point-inside-the-java-util-class).


После этого дебагер полез в джавовские класы и я смог увидеть на каком этапе вылетал эксепшн.

Остались вопросы:
1). Вроде бы для того, чтобы видеть переменные, нужно перекомпилировать файл rt.jar(но мне это сейчас не актуально).
2). Что такое debug информация, как с ней работать и нужно ли ее прикреплять к своим классам?
3). Есть ли разница, с чем работать с JRE или JDK?

Если у кого есть ссылки на хорошие материалы по теме - поделитесь. Тема закрыта. Спасибо.
20 фев 19, 00:04    [21814967]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
faustgreen, отладочная информация по умолчанию включается в компилляцию.

это опции:
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
  -g:{lines,vars,source}     Generate only some debugging info

Тоесть любой ваши бинарник по умолчанию совместим с отладкой. Если вы уберете эту информацию
например :lines тогда не будет связи между опкодом и строчкой в исходном коде
и ваш отладчик не сможет прыгнуть в точное место.

JRE нужно ставить только конечному пользователю чтобы запускать java-приложения локально.

Некоторые современные оконные приложения поставляются вместе с jre или альтернативными упаковщиками
которые делают "почти экзешник".
20 фев 19, 00:46    [21814978]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
Garrick
Member

Откуда: Москва
Сообщений: 2905
mayton
JRE нужно ставить только конечному пользователю чтобы запускать java-приложения локально.

JDK от JRE отличается наличием компилятора, исходников и некоторых инструментов, нужных только разработчику. Для выполнения скомпилированного приложения достаточно только JRE. Для компиляции нового приложения нужно JDK. Но если вы используете Eclipse, то у него есть свой компилятор, ему JDK не обязательно.
20 фев 19, 10:27    [21815168]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
cossack5
Member

Откуда:
Сообщений: 441
В Идее отладчик по умолчанию не заходит в пакеты com.sun.*/ sun.* синтетические методы, сгенерированные в рантайме методы, классы и т.д. Настраивается в Debugger/Stepping.
20 фев 19, 11:05    [21815206]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
Garrick
Member

Откуда: Москва
Сообщений: 2905
faustgreen
Как сделать так, чтобы дебагер заходил в код класса Character

Фильтры настраивали?

К сообщению приложен файл. Размер - 38Kb
20 фев 19, 11:35    [21815237]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Garrick
mayton
JRE нужно ставить только конечному пользователю чтобы запускать java-приложения локально.

JDK от JRE отличается наличием компилятора, исходников и некоторых инструментов, нужных только разработчику. Для выполнения скомпилированного приложения достаточно только JRE. Для компиляции нового приложения нужно JDK. Но если вы используете Eclipse, то у него есть свой компилятор, ему JDK не обязательно.

У меня есть сомнения в "правильности использования встроенных" компилляторов.
20 фев 19, 12:42    [21815307]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9028
mayton
У меня есть сомнения в "правильности использования встроенных" компилляторов.
1. javac умеет кросскомпиляцию;
2. Чтобы получить javac и некоторые другие утилиты Java 6/7/8 достаточно добавить tools.jar в jre/lib/;
3. Чтобы удобно вызывать компилятор - достаточно простенькой обёртки.
+ Как пример
public static
void main(String[] args)
{
  javax.tools.JavaCompiler jc =
  javax.tools.ToolProvider.getSystemJavaCompiler();
  if (jc == null) {
    System.err.println(" Compiler tool is not available.");
    System.exit(1);
  }
  jc.run(System.in, System.out, System.err, args);
}
20 фев 19, 14:09    [21815429]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Ну даже в этом случае вам нужно втащить в систему 3 штуки JDK. Помним о том что автор хотел отладку
системного кода.
20 фев 19, 14:18    [21815442]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
faustgreen
Member

Откуда:
Сообщений: 318
Garrick
Фильтры настраивали?


Я так понимаю на приведенной вами картинке (меню Windows-Preference-Java-Debug-Step filtering), записи, которые отмечены птичкой, наоборот будут исключены из прохода дебагером. Вот что в хелпе eclipse написано:
Step filters are commonly used to filter out types that you do not wish to see or step through while debugging.

For example, if you did not want to the see or step through anything from the class java.lang.Object, you would add this to the list of filtered types.


Т.е., если я правильно понял, у нас изначально дебагер должен иметь возможность бегать по коду всех классов, а настройками Step Filtering мы можем ограничивать общий список.

Дома проверю.
20 фев 19, 14:30    [21815451]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9028
mayton
Ну даже в этом случае вам нужно втащить в систему 3 штуки JDK
6/7/8 - это там, где приём работает. В Java 6 вообще появилось API, восьмёрка - последняя немодуляризированная версия.
Ну и "втащить JDK" - совсем не требуется. Достаточно только rt.jar нужной версии, если целевая версия отличается от рабочей.
Можно и без rt.jar "чужой" версии, но тогда компилятор предупредит, что версию байт-кода он гарантирует, а вот API - не очень.
Помним о том что автор хотел отладку системного кода
Я отвечал не на странные хотелки автора, а на ваше сомнение о встроенных компиляторах.
20 фев 19, 16:02    [21815550]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Как будет угодно. rt.jar на улице не валяется. Вы все равно будете "качать" JDK.
Может для кого-то проблема держать на машинке 2 джедеки? У меня их 4 штуки
и я нормально пока себя чувствую.
20 фев 19, 17:26    [21815636]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
Garrick
Member

Откуда: Москва
Сообщений: 2905
faustgreen
Garrick
Фильтры настраивали?


Я так понимаю на приведенной вами картинке (меню Windows-Preference-Java-Debug-Step filtering), записи, которые отмечены птичкой, наоборот будут исключены из прохода дебагером. Вот что в хелпе eclipse написано:
Step filters are commonly used to filter out types that you do not wish to see or step through while debugging.

For example, if you did not want to the see or step through anything from the class java.lang.Object, you would add this to the list of filtered types.


Т.е., если я правильно понял, у нас изначально дебагер должен иметь возможность бегать по коду всех классов, а настройками Step Filtering мы можем ограничивать общий список.

Дома проверю.

Да, всё верно. Фильтрами настраивается именно то, куда не надо "заходить".
20 фев 19, 17:38    [21815658]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9028
mayton
Вы все равно будете "качать" JDK.
И?..

К сообщению приложен файл. Размер - 2Kb
20 фев 19, 18:47    [21815726]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Basil A. Sidorov, к чему это?
20 фев 19, 18:50    [21815732]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9028
mayton
Basil A. Sidorov, к чему это?
К тому, что в гигабайтах загрузок мегабайты JDK никакой роли не играют.
Более того, когда я занимался поддержкой соответствующего софта, у меня было по нескольку выпусков каждой из разных версий - от Java 1.4 до Java 1.7.
Если всё ещё непонятно, то извольте: Расшифруйте, пожалуйста, что именно означает ваше замечание о необходимости "качать JDK?"

P.S.
Сборка, которую выдавали разработчики имела размер 200-280МБ.
Это сравнимо с размером JDK или превышает его, но при этом обновление JDK происходит относительно редко, а обновления софта - относительно часто.
20 фев 19, 19:00    [21815741]     Ответить | Цитировать Сообщить модератору
 Re: Debug с заходом в Java.lang  [new]
mayton
Member

Откуда: loopback
Сообщений: 39264
Ладно. Проехали. Я не измерял мегабайты. Я измерял активности человека в часах.
20 фев 19, 19:20    [21815755]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить