Что может вызвать ловушку трассировки / прерывания (сбрасывание ядра)? [Дубликат]

Если вы похожи на меня, когда я впервые начал использовать Java, я хотел использовать оператор «==» для проверки того, были ли два экземпляра String одинаковыми, но к лучшему или худшему это не правильный способ сделать это в Java.

В этом уроке я продемонстрирую несколько разных способов правильно сравнить строки Java, начиная с подхода, который я использую большую часть времени. В конце этого руководства по сопоставлению Java String я также обсужу, почему оператор «==» не работает при сравнении строк Java.

Вариант 1: Сравнение строк Java с методом equals Большая часть (возможно, в 95% случаев). Я сравниваю строки с методом equals класса Java String следующим образом:

if (string1.equals(string2))

Этот метод String равен методу для двух строк Java, и если они содержат точно такую ​​же строку символов, они считаются равными.

Взглянув на быстрый пример сравнения строк с методом equals, если был выполнен следующий тест, две строки не будут считаться равными, поскольку символы не являются точно такими же (случай символов различен):

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

Но, когда две строки содержат одну и ту же строку символов, метод equals вернет true, как в этот пример:

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Вариант 2: Сравнение строк с методом equalsIgnoreCase

В некоторых строковых сравнительных тестах вы захотите игнорируйте, являются ли строки строчными или строчными. Если вы хотите проверить свои строки на равенство в этом случае нечувствительным образом, используйте метод equalsIgnoreCase класса String, например:

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

Вариант 3: сравнение строк Java с методом compareTo

Существует также третий, менее распространенный способ сравнения строк Java, и это с методом сравнения String класса. Если две строки точно совпадают, метод compareTo вернет значение 0 (ноль). Ниже приведен краткий пример того, как выглядит этот метод сравнения строк:

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Пока я пишу об этой концепции равенства в Java, важно отметить, что язык Java включает в себя метод equals в базовый класс Java Object. Всякий раз, когда вы создаете свои собственные объекты, и вы хотите предоставить средства для проверки того, являются ли два экземпляра вашего объекта «равными», вы должны переопределить (и реализовать) этот метод equals в своем классе (точно так же, как язык Java предоставляет это равенство / сравнение в методе String равно).

Вы можете посмотреть на это ==, .equals (), compareTo () и compare ()

0
задан kessi 6 December 2017 в 16:38
поделиться

2 ответа

Эффективно это дубликат вашего другого вопроса .

Как я уже сказал в комментариях, вы не предоставляете почти достаточную информацию для помочь тебе. Подробности имеют значение , и вы утаиваете их. Версии GDB и gdbserver, как вы вызываете GDB и gdbserver, какие предупреждения вы получаете от GDB (если таковые имеются).

Теперь это сообщение об ошибке:

Program received signal SIGTRAP, Trace/breakpoint trap. [Switching to Thread 6]

обычно означает, что gdbserver не привязал ни один из потоков вашего процесса, и этот поток попытался выполнить инструкцию точки останова (у вас есть контрольные точки, установленные до этого, не так ли?).

Один из причины, по которым это может произойти, - это когда ваш GDB загружает «неправильный» libthread_db.so (тот, который не соответствует цели libc.so.6).

то, что делает вещество более сумасшедшим, - это тот факт, что коллега и я использую один и тот же сеанс (отладка выполняется с помощью cygwin с удаленной машиной), и он отлично подходит для них, но не для меня.

Я не уверен, что вы подразумеваете под «тот же сеанс», но это, вероятно, не «когда он набирает команды, они работают, но когда я ввожу те же команды в один и тот же GDB, они не«.

Одно различие между вами и вашим коллегой может быть LD_LIBRATY_PATH изменением окружения е настройки. Другой может быть в ~/.gdbinit или в ./.gdbinit.

Я предлагаю запустить gdb -nx, чтобы избавиться от последнего, и отключить LD_LIBRARY_PATH, чтобы избавиться от первого.

1
ответ дан Employed Russian 17 August 2018 в 08:57
поделиться
  • 1
    Когда я говорю один и тот же сеанс, я имею в виду, что мы оба вошли в систему как один и тот же пользователь на той же машине. Что касается версии gdb, то это 7.2. – kessi 7 December 2017 в 12:35

Проблема со всем, и по какой-то причине никто не заметил, что это так: так я называю gdb /usr/local/build/gdbx.y/gdb/gdb, что я должен делать, это следующее: /usr/local/build/gdbx.y/build/gdb/gdb Это была проблема пути.

0
ответ дан kessi 17 August 2018 в 08:57
поделиться
  • 1
    После локальной установки gdb вы обычно находите gdb в /usr/local/bin/gdb. Что-то звучит немного необычно. – jww 17 July 2018 в 20:01
Другие вопросы по тегам:

Похожие вопросы: