bt
, как говорят, печатает обратную трассировку всего стека: одна строка на кадр для всех кадров в стеке, но я вижу только имя функции в выводе?Почему это так?
Обратный след показывает текущую функцию, затем функцию, которая ее вызывала, и так далее, вплоть до main()
.Каждый «кадр стека» - это часть стека, используемая определенной функцией, поэтому на каждую функцию приходится один кадр.Поскольку текущая функция равна main()
, отображается только один кадр.
(Возможно, вы надеялись, что обратная трассировка позволит вам увидеть каждую строку кода, которая была выполнена.К сожалению, при нормальном запуске кода (что делает gdb
, кроме добавления точек останова), для этого недостаточно доступной информации; лучшее, что вы можете сделать, - это посмотреть историю вызовов функций.)
bt full
показывает внутреннюю работу, как она может прочитать 'obj', когда элемент управления еще не находится в этой строке (dummyA obj;
) еще?
Выделено место(в кадре локального стека) для объекта;это просто еще не было инициализировано.Вы видите, что происходит в этом пространстве, и оно должно стать {x = 0}
, если вы перешагнете строку инициализации.
Вышеприведенный вывод ничего не показывает, потому что функция вызываемого пользователя testB
имеет нольлокальные переменные?Это правильно?
Это ничего не показывает, потому что вы просили его ничего не показывать;аргумент bt
указывает, сколько стековых кадров нужно показать, а вы сказали ноль.
Что именно показывают кадры 1 и 2?
В первом случаеВы запросили один кадр стека;это текущей функции.Он сообщает вам, что вы находитесь в функции dummyA::testB
, что адрес объекта, для которого он был вызван (this
), равен 0x7fffffffdc50
, а соответствующая строка источника - строка 20 из backtrace.cpp
. * 1040.*
Во втором случае вы запросили два кадра, поэтому он также показывает, откуда была вызвана текущая функция: функция main()
, строка источника 31 backtrace.cpp
.
Почему x
имеет здесь два разных значения, предполагая, что точка останова находится на главном?
Каждый является членом другого объекта (obj1.x
и obj2.x
), и ни один не былинициализирован;поэтому каждый из них показывает какое-то случайное значение, которое оказывается в этой ячейке памяти.Опять же, оба станут равны нулю, если вы переступите через инициализаторы.