Значение ошибки отладчика ошибки сегментации означает? - PullRequest
1 голос
/ 03 ноября 2019

Я изучаю c ++, и у меня ошибка сегментации с моим кодом. Я запустил отладчик и получил следующее сообщение об ошибке, которое мне трудно понять.

Program received signal SIGSEGV, Segmentation fault. 0x0000000008002e3e in std::__uniq_ptr_impl<TreeNode<int>, std::default_delete<TreeNode<int> > >::_M_ptr (this=0x8) at /usr/include/c++/7/bits/unique_ptr.h:147 
147      pointer      _M_ptr() const { return std::get<0>(_M_t); }

Означает ли это, что ошибка сегментации происходит в строке 147 в моем классе TreeNode? Если это так, строка 147. пуста.

Может кто-нибудь уточнить, пожалуйста.

Редактировать: после следования совету @HolyBlackCats я набрал bt и получил следующее сообщение.

#0  0x0000000008002e3e in std::__uniq_ptr_impl<TreeNode<int>, std::default_delete<TreeNode<int> > >::_M_ptr (this=0x8) at /usr/include/c++/7/bits/unique_ptr.h:147  

#1  0x0000000008002680 in std::unique_ptr<TreeNode<int>, std::default_delete<TreeNode<int> > >::get (this=0x8) at /usr/include/c++/7/bits/unique_ptr.h:337

#2  0x0000000008001c55 in BinarySearchTree<int>::begin (this=0x7ffffffedf48) at tree.h:99

#3  0x0000000008000d98 in main () at TestTreeD.cpp:20

Я до сих пор не понимаю, что это значит.

1 Ответ

1 голос
/ 03 ноября 2019

Как указывается в сообщении об ошибке, произошла ошибка при выполнении кода, скомпилированного из строки 147 заголовочного файла библиотеки C ++.

Функция обратного отслеживания показывает стек выполнения в точке, где происходит обратное отслеживание.

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

Иногда даже сама обратная трассировка является мусором, потому что стек поврежден.

А в других случаях обратная трассировка будет хорошей,но не имею ничего, чтобы рассказать вам о причине segfault, но он расскажет вам, как вы оказались в этой части кода. Так, например, вы могли бы использовать эту информацию, чтобы установить точку останова ранее в коде, до сбоя, и когда выполнение останавливается там, вы можете анализировать и проверять значения всех объектов и переменных и видеть, кажется ли что-либо неуместнымили если что-то не так. Что означает «что-то не так», будет зависеть от вас, чтобы определить, основываясь на точных деталях вашего приложения.

Я мог бы найти только одну подсказку, которая очевидна, проверяя показанную вами обратную трассировку, которая была бы стековойframe # 1:

#1  0x0000000008002680 in std::unique_ptr<TreeNode<int>,
   std::default_delete<TreeNode<int> > >::get (this=0x8)
                                              ==========

Согласно этому обратному следу, код выполняет объект по адресу памяти 0x8. Это, очевидно, полная чушь. Очень часто можно увидеть this из 0x0, он же нулевой указатель, когда поднимается пылающий обломок следа назад. 0x8 достаточно близко, чтобы указать на повреждение памяти. Возможно, какой-то объект имеет unique_ptr в качестве члена класса, указатель на этот объект равен нулю, и код пытается вызвать метод unique_ptr, который находится по смещению 0x8 в классе, который его содержит.

Итак, на этом этапе показанный код, скорее всего, использовал указатель мусора, или неинициализированную ссылку, или какую-то другую логическую ошибку для вызова метода через неверный указатель или ссылку.

Следующим вашим шагом будет установка точки останова, где бы ни находился фрейм стека № 2, который вызвал бы какую-то операцию на каком-то поддельном unique_ptr месте, которое он получил. Исходя из того, что вы там видите, вы либо найдете больше подсказок, либо, изучив окружающий код, сможете определить основную ошибку.

Удачи.

...