Как работает обратный след? - PullRequest
3 голосов
/ 30 января 2012
#include <iostream>
using namespace std;

class dummyA
{
    int x;
    public:
        dummyA ()
        {
            x = 0;
        }

        void test ()
        {
            x++;
        }
};

int main ()
{
    cout << "\nG'Morning";
    dummyA obj;
    obj.test ();
    return 0;
}

Вывод обратной трассировки:

(gdb) bt
#0  main () at backtrace.cpp:21
(gdb) bt full
#0  main () at backtrace.cpp:21
        obj = {x = -8896}
(gdb) n

22              dummyA obj;
(gdb) 

Вопросы:

  • bt, как говорят, печатает обратную трассировку всего стека: одна строказа кадр для всех кадров в стеке, но я вижу только имя функции в выводе?Почему это так?
  • bt full показывает внутреннюю работу, как она может прочитать 'obj', когда элемент управления еще не находится в этой строке (dummyA obj;) еще?

РЕДАКТИРОВАТЬ 1:

Breakpoint 1, dummyA::testB (this=0x7fffffffdc50) at backtrace.cpp:20
20                              x = x + 2;
(gdb) bt 0
(More stack frames follow...)
  • Приведенный выше вывод ничего не показывает, потому что функция вызываемого абонента testB имеет нулевые локальные переменные?Это правильно?
(gdb) bt 1
#0  dummyA::testB (this=0x7fffffffdc50) at backtrace.cpp:20
(More stack frames follow...)

(gdb) bt 2
#0  dummyA::testB (this=0x7fffffffdc50) at backtrace.cpp:20
#1  0x000000000040078b in main () at backtrace.cpp:31
  • Что именно показывают кадры 1 и 2?

(gdb) bt full
# 0 main () на backtrace.cpp: 26
obj1 = {x = -8896}
obj2 = {x =0}

  • Почему x имеет здесь два разных значения, предполагая, что точка останова находится на главном?

WRT следующий код:

#include <iostream>
using namespace std;

class dummyA
{
    int x;
    public:
        dummyA ()
        {
            x = 0;
        }

        void testA ()
        {
            x = x + 1;
        }

        void testB ()
        {
            x = x + 2;
        }
};

int main ()
{
    cout << "\nG'Morning";
    dummyA obj1;
    dummyA obj2;

    obj1.testA ();
    obj1.testB ();

    obj2.testA ();
    obj2.testB ();

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 30 января 2012

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), и ни один не былинициализирован;поэтому каждый из них показывает какое-то случайное значение, которое оказывается в этой ячейке памяти.Опять же, оба станут равны нулю, если вы переступите через инициализаторы.

2 голосов
/ 30 января 2012

Объект еще не построен, но для него выделено место. Вы видите весь обратный след - вы находитесь в main, точка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...