2012-06-20 2 views
1

Я занимаюсь разработкой в ​​LLVM и KLEE, и у меня возникают проблемы с gdb. Я скомпилировал все с -O0 и -ggdb args, чтобы избавиться от оптимизаций и добавить символы отладки. Я много раз использовал gdb для отладки кода c, но это мой первый раз, используя его на C++.gdb продолжается вместо степпинга

Когда я пытаюсь выполнить отладку с помощью gdb, все работает правильно, за исключением того, что команда «next» иногда «продолжается» вместо перехода к следующей строке источника. Отладчик всегда останавливается на точках останова, но, кажется, решили пропустить много строк, чем это необходимо с рядом ... Так, например, я мог бы что-то вроде:

int foo::bar(list_class<int> &list, int num){ 

    int i; 
    num = num + 3; 

    for(i = 0; i < 5; i++){ 
     list.add(num + i); 
    } 

    num = num + 42; 
    return num; 
} 

Если я нарушу строку:

num = num + 42; 

и я «следующий» от линии

num = num + 3; 

Он будет полностью пропустить петлю для остановки и в точке разрыва. Если я не установлю разрыв на линии, функция вернется. Если я установил точку останова в строке:

list.add(num + i); 

Программа всегда останавливается в точке останова. У кого-нибудь есть предложения? Заранее спасибо.

Edit:

Вот некоторые ошибки, которые GDB бросает меня. Я не уверен, связаны ли они с проблемой или нет.

warning: can't find linker symbol for virtual table for `std::basic_string<char, std::char_traits<char>, std::allocator<char> >' value 
warning: can't find linker symbol for virtual table for `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider' value 
warning: can't find linker symbol for virtual table for `std::_Rb_tree_node_base' value 
warning: found `klee::PTree::PTree(klee::ExecutionState* const&)' instead 
warning: can't find linker symbol for virtual table for `klee::KInstIterator' value 
warning: found `klee::Executor::runFunctionAsMain(llvm::Function*, int, char**, char**)' instead 
warning: can't find linker symbol for virtual table for `klee::TreeOStream' value 
warning: found `std::string::compare(char const*) const' instead 
warning: can't find linker symbol for virtual table for `klee::ImmutableMap<klee::MemoryObject const*, klee::ObjectHolder, klee::MemoryObjectLT>' value 
warning: found `bool std::operator==<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)' instead 
warning: can't find linker symbol for virtual table for `klee::ImmutableTree<klee::MemoryObject const*, std::pair<klee::MemoryObject const*, klee::ObjectHolder>, klee::_Select1st<std::pair<klee::MemoryObject const*, klee::ObjectHolder>, klee::MemoryObject const*>, klee::MemoryObjectLT>' value 
warning: found `bool std::operator==<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)' instead 

Edit # 2 (Раскрыты)

я решил мою проблему путем обновления до последней версии БГД (7.4). Я использовал версию 7.1-ubuntu.

+1

Вы пытались использовать 'step' вместо' next'. – panickal

+0

Несмотря на ваши меры предосторожности, чтобы избежать оптимизации, я бы разобрал эту функцию (вы можете использовать 'disas' в' gdb' или использовать 'objdump -d' из командной строки) и посмотреть, что компилятор действительно сделал с этим циклом. Кажется, что вы передали 'list' на * значение *, поэтому ваша целая функция является no-op, и компилятор, возможно, понял это. –

+0

У меня было gdb делать странные или невозможные вещи много раз раньше; поговорив с другими разработчиками об этом, у меня возникает ощущение, что для некоторых людей это не работает. – akroy

ответ

0

Я решил свою проблему, обновив до последней версии gdb (7.4). Я использовал версию 7.1-ubuntu.

Смежные вопросы