2013-06-23 4 views
0

У меня есть этот код C++ 11, который использует unique_ptr в векторе.lldb on xcode vs lldb on standalone

#include <vector> 
#include <iostream> 
#include <memory> 

using namespace std; 

class A 
{ 
    int x; 
public: 
    A() {} 
    ~A() {} 
    A(A& a) {} 
    A(int x) {this->x = x;} 
    int get() {return x;} 
}; 

int main() 
{ 
    vector<unique_ptr<A>> v; 
    auto a = new A(10); 
    unique_ptr<A> pa(a); 
    v.push_back(move(pa)); // move(pa); 

    auto a2 = new A(20); 
    unique_ptr<A> pb(a2); 
    v.push_back(move(pb)); // move(pa); 

    for (auto& i: v) 
    { 
     cout << i->get(); 
    } 
} 

Я мог бы использовать Xcode для отладки и проверки значения в векторе>. Однако, когда я компилирую тот же код с clang и debug в lldb, есть две ошибки.

enter image description here

Первый lldb следы в исходный код STL.

* thread #1: tid = 0x1f03, 0x0000000100001744 a.out`__gnu_cxx::__normal_iterator<std::unique_ptr<A, std::default_delete<A> >*, std::vector<std::unique_ptr<A, std::default_delete<A> >, std::allocator<std::unique_ptr<A, std::default_delete<A> > > > >::operator*() const at stl_iterator.h:740, stop reason = step over 
    frame #0: 0x0000000100001744 a.out`__gnu_cxx::__normal_iterator<std::unique_ptr<A, std::default_delete<A> >*, std::vector<std::unique_ptr<A, std::default_delete<A> >, std::allocator<std::unique_ptr<A, std::default_delete<A> > > > >::operator*() const at stl_iterator.h:740 
    737 
    738  // Forward iterator requirements 
    739  reference 
-> 740  operator*() const 
    741  { return *_M_current; } 
    742 
    743  pointer 
(lldb) n 
Process 41243 stopped 

Вторая ошибка: у меня есть ошибка сегментации, когда я пытался увидеть содержимое вектора.

(lldb) p v 
Segmentation fault: 11 

Я использовал эту команду для компиляции.

clang++ -std=c++11 -stdlib=libc++ -g testit.cpp -o a 

Что может быть неправильным?

ответ

0

Я переустановил Xcode с новейшей версией для Lion: Xcode 4.6, и проблема исчезла.

0

ваша вина сегментации кажется, что это может быть вызвано одной из двух вещей:

  • выражения LLDB парсер
  • Форматирующих LLDB данных

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

Если бы вы могли извлечь его из ~/Library/Logs/DiagnosticReports и добавить его к этому вопросу (а также сообщить об ошибке с Apple, в http://bugreport.apple.com), было бы хорошей отправной точкой

Кроме того, похоже, что вы используете пре- 5 Xcode. Это верно? У вас есть доступ к Xcode 5 Developer Preview, чтобы проверить, воспроизводится ли это? LLDB значительно улучшилось между 4.x и 5, поэтому вам может быть повезло больше.