Как указывается в сообщении об ошибке, произошла ошибка при выполнении кода, скомпилированного из строки 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
месте, которое он получил. Исходя из того, что вы там видите, вы либо найдете больше подсказок, либо, изучив окружающий код, сможете определить основную ошибку.
Удачи.