gdb шаг назад и вперед с следующей командой над gcc скомпилированной программой на C ++ [duplicate]

Я не говорю, что это лучшее решение или предпочтительное решение данной проблемы. Однако может быть полезно помнить, что функции могут возвращать структуры. Хотя функции не могут возвращать массивы, массивы могут быть обернуты в структуры, и функция может возвращать структуру, тем самым перенося массив с ней. Это работает для массивов с фиксированной длиной.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    typedef
    struct 
    {
        char v[10];
    } CHAR_ARRAY;



    CHAR_ARRAY returnArray(CHAR_ARRAY array_in, int size)
    {
        CHAR_ARRAY returned;

        /*
        . . . methods to pull values from array, interpret them, and then create new array
        */

        for (int i = 0;  i < size; i++ )
            returned.v[i] = array_in.v[i] + 1;

        return returned; // Works!
    } 




    int main(int argc, char * argv[])
    {
        CHAR_ARRAY array = {1,0,0,0,0,1,1};

        char arrayCount = 7;

        CHAR_ARRAY returnedArray = returnArray(array, arrayCount); 

        for (int i = 0; i < arrayCount; i++)
            printf("%d, ", returnedArray.v[i]);  //is this correctly formatted?

        getchar();
        return 0;
    }

Я предлагаю комментарии о сильных и слабых сторонах этого метода. Я не удосужился это сделать.

4
задан merveotesi 9 November 2011 в 14:17
поделиться

1 ответ

Библиотека, в которую вы входите, была построена с помощью оптимизационных и отладочных символов (скорее всего, -g -O2, который по умолчанию для сборников Linux).

Отладка оптимизированного кода несколько сложна, поскольку поток управления оптимизация заставляет код «прыгать», некоторые переменные становятся «<optimized out>» и т. д.

Вы можете перестроить библиотеку с помощью CXXFLAGS = -g -O0, или вы можете научиться отлаживать при оптимизации.

Последнее очень полезное умение, так как много раз ваша программа будет только сбой в оптимизированном режиме, и вам все равно придется отлаживать его в этом режиме.

11
ответ дан Employed Russian 18 August 2018 в 19:11
поделиться
  • 1
    Привет, спасибо за ответ, я изменил Makefile в корневом каталоге dir библиотеки, с O2 на O0, сделайте удаление старого. После этого runautoconf, настройте, сделайте, сделайте установку еще раз. Но все же gdb работает как над расшифровкой стенограммы. – merveotesi 9 November 2011 в 19:25
  • 2
    «Я изменил Makefile в корневом каталоге dir библиотеки». Почему вы считаете, что этого достаточно? Перестройте его снова, запустив все команды, которые выполняет сборка, и убедитесь, что resultiterator.cpp на самом деле построена с помощью -O0, а не -O2. Если он является построен с -O0, то вы не используете библиотеку, которую вы только что создали. – Employed Russian 9 November 2011 в 19:40
  • 3
    Спасибо, @Employed Russian. Я экспортирую CFLAGS = -g -O0 CXXFLAGS = -g -O0 и runautoconf, настраивать, очищать, устанавливать. И теперь gdb запускает весь код по строкам в порядке, теперь у меня есть другие вопросы об определенном tesseract, возможно, в другом вопросе. Благодарю. – merveotesi 9 November 2011 в 21:39
  • 4
    Да, это проблема с g ++, а не с gdb / ddd. Он не только делает gdb skip lines, но и производит неправильный вывод, потому что он иногда оптимизирует материал неправильно. Я столкнулся с проблемой c ++ 11 с gcc-5.4.0, для назначения, которое было последней строкой в ​​конструкторе, - эту строку просто пропускали, когда использовался -O3, но делая ее -O0 заставлял код работать правильно , – R71 9 November 2017 в 15:38
  • 5
    @ R71 В то время как ошибки компилятора (производящие неправильный код) не являются неслыханными, маловероятно extreme , что вы обнаружили его в выпущенной версии GCC. Скорее всего, ваш код имеет неопределенное поведение, что позволяет компилятору делать что-либо , которое он хочет (в том числе пропускать части вашего кода целиком). – Employed Russian 9 November 2017 в 16:06
Другие вопросы по тегам:

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