Вызов функции GDB для std :: vector из локальной области видимости приводит к ошибке - PullRequest
3 голосов
/ 26 марта 2012

Я тестирую функцию vect_dbg(vector<int>), которая возвращает содержимое вектора STL в виде строки C, поэтому я могу вызвать ее с помощью gdb output vect_dbg(test) или поместить в часы.

#include<vector>
using namespace std;

int main()
{
    vector<int> test; //breakpoint; output vect_dbg(test) ends debugging.
    for (int i=0;i<=10;i++) test.push_back(i);
    return 0;
}

#include<sstream>
const char* vect_dbg(const vector<int> &V)
{
    stringstream ss;
    for (int i=0;i<V.size();i++)
        ss<<"V["<<i<<"]:"<<V[i]<<' ;'; //line 16
    static char sEnu[256];
    ss.getline(sEnu,256);
    return sEnu;
}

К сожалению, output vect_dbg(test) прерывает отладку.

Отлаживаемая программа сигнализировалась в функции из ГДБ. GDB восстановил контекст до того, что было до вызова. Чтобы изменить это поведение, используйте «set unwindonsignal off». выражение, содержащее функцию (vect_dbg (std :: vector> const &)), будет прекращено. Программа получена сигнал SIGSEGV, ошибка сегментации. 0x004014b1 в vect_dbg (V = @ 0x22ff34) в main.cpp: 16

Я обнаружил, что функция работает, если я сделаю test глобальным, но я не смог найти решение для локально определенного вектора. Как я могу решить это? Большое спасибо.

РЕДАКТИРОВАТЬ: В основном решена, ответ был довольно очевидным, вектор не был инициализирован в точке останова. Теперь мне интересно, возможно ли это обнаружить в vect_dbg. Альтернатива, которую я нашел, - объявить статический vector<int>.

1 Ответ

3 голосов
/ 26 марта 2012

Поместите точку останова через одну строку после (в цикле for). Переменная test еще не была инициализирована при попытке ее использования.

...