Невозможно просмотреть ввод пользователя при отладке ввода CQL в Cassandra

ТАК, что у меня возникли проблемы с попыткой отладить программу, которую я использую, и мне интересно, может ли кто-нибудь мне помочь.

Текущая среда: я запускаю Cassandra (v2), используя прилагаемый cqlsh (v3). Я вношу изменения в некоторые из его функций, а затем использую cqlsh для проверки команд, чтобы увидеть, работают ли мои изменения так, как задумано, или, если нет, как выглядит ввод, когда я пошагово выполняю программу. Я запускаю сеанс отладки (либо в eclipse, либо в IntelJ, на самом деле не имеет значения), запуская код сервера для приема соединений/ввода. Затем я загружаю cqlsh и указываю пространство ключей, которое хочу использовать. Кажется, это работает нормально. Затем я запускаю строку cql, чтобы проверить свои изменения через командную строку. Я ожидаю увидеть запись командной строки, перехваченную отладчиком в моей среде IDE, где я могу увидеть, как ввод обрабатывается моими изменениями кода. То, что я вижу, вообще ничего не происходит, как будто команда не была отправлена.

Итак, мои вопросы будут следующими:

1) Должен ли я видеть что-либо в моей отладочной среде IDE при выполнении команд, как описано выше? 2) Если нет, то как бы вы отлаживали серверное приложение с такой конфигурацией, особенно в области обработки пользовательского ввода? 3) Если да, то какие настройки я должен проверить, чтобы убедиться, что я установил их правильно, или какие процессы следует выполнить для просмотра и отладки указанных материалов?

Я полагаю, что должен быть лучший способ, чем иметь 50 000 System.out.println() повсюду (при условии, что они вообще будут работать), или, по крайней мере, я надеюсь, что есть.

Спасибо всем, кто это читает. Любые вопросы (которые, я уверен, могут возникнуть, поскольку я, вероятно, использую неправильные дескрипторы), пожалуйста, задавайте.


person canadiancreed    schedule 15.03.2014    source источник


Ответы (1)


Я добился успеха со следующим подходом.

  1. Обязательно скомпилируйте с -g (используйте как: javac -g), чтобы включить генерацию всей отладочной информации.
  2. При запуске вашего приложения используйте соответствующие флаги отладки (например, java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1414, число — это порт, к которому вы подключаетесь), чтобы запустить сервер отладки. Обратите внимание, что вы можете выполнять отладку с удаленного хоста (отладчик будет подключаться с использованием синтаксиса hostname:port). Вам не нужно набирать все это для Кассандры; вы можете просто раскомментировать соответствующую строку в cassandra-env.sh (в Windows посмотрите в bin/Cassandra.bat или, если работаете с дистрибутивом Datastax, в разделе реестра HKLM\SOFTWARE\[optionally Wow6432Node\]Apache Software Foundation\[Procrun node]\[Cassandra node]\Parameters\Java:Options).
  3. Подключитесь к вашему серверу из вашей IDE (я использовал Eclipse, IntelJ похож, я уверен).
  4. Откройте исходный код в среде IDE и установите несколько точек останова, которые будут задействованы в вашем случае использования.
  5. Запустите свой сценарий. Ваши точки останова должны сработать. Для окончательного подтверждения того, что настройка работает, поставьте точку останова на то, что гарантировано будет выполнено во время сценария, а не на то, что, по вашему мнению, должно выполняться.

В вашем случае, поскольку вы можете успешно указать пространство ключей, я считаю, что все работает, а затем возникает тихий сбой, когда вы пытаетесь выполнить другие шаги, возможно, внесенные вашими изменениями. Чтобы подтвердить, я бы рекомендовал откатить все ваши изменения и сначала протестировать настройку отладчика на чистой сборке.

Наконец, и это может быть излишним, CQLSH — это программа, написанная на Python и работающая отдельно от Cassandra в другом процессе. Поэтому вы не можете увидеть фактическую «запись командной строки» от отладчика Java. Самое близкое, что вы можете получить к своему необработанному вводу, - это поставить точки останова где-нибудь в пакете cql3, чтобы увидеть, как операторы CQL передаются (надеюсь). Конечно, вы можете использовать отладчик Python для отладки CQLSH, если это то, что вам нужно.

person Daniel S.    schedule 15.03.2014
comment
Ах, хорошо, по какой-то причине я понял, что cqlsh передаст указанную строку cassandra для обработки, и я мог видеть эту строку или, по крайней мере, если не всю ее, либо часть, либо результат ее выполнения. Если это неверно, это объясняет, почему я получаю результаты, которые не соответствуют моим ожиданиям. - person canadiancreed; 16.03.2014
comment
Cqlsh довольно объемен: более 2 тыс. строк кода, так что он выполняет большую часть обработки ввода самостоятельно, хотя большинство команд перенаправляется в Cassandra. Хорошее эмпирическое правило заключается в том, что если вы вводите оператор CQL, он передается Cassandra, а если это команда CQLSH, он обрабатывается внутри скрипта Python. - person Daniel S.; 16.03.2014
comment
Хм, к сожалению, это не работает для систем Windows. Файл настроек никогда не загружается. - person canadiancreed; 16.03.2014
comment
В Windows вам нужно сделать то же самое в одном из двух мест. Если вы запускаете Cassandra с bin/Cassandra.bat (скорее всего, если вы установили дистрибутив Apache), вам нужно будет добавить туда аргументы отладки в JAVA_OPTS. Если вы установили дистрибутив Datastax, откройте regedit и найдите ключ под чем-то вроде HKLM\SOFTWARE\[optionally Wow6432Node\]Apache Software Foundation\[Procrun node]\[Cassandra node]\Parameters\Java. Там найдите значение Options; здесь вам нужно добавить аргументы отладки Java. - person Daniel S.; 16.03.2014
comment
Этот дополнительный сделал это. Я бы добавил это к вашему ответу. Спасибо за помощь - person canadiancreed; 17.03.2014