2015-04-06 59 views
3

我在Xcode中爲OS X創建了一個大型的C/C++/Objective-C項目。該項目鏈接到預先構建的Qt5庫。在Xcode中,如何使用外部庫進行調試,您有源代碼?

這一切都很好地工作,直到崩潰,我得到一個堆棧跟蹤與Qt函數。如果我點擊某個Qt函數的堆棧框架,Xcode/lldb會顯示程序集而不是源代碼 - 我將Qt用作外部庫,所以我沒有任何Qt源代碼在我的項目中。我怎樣才能解決這個問題?

我已經嘗試將Qt5源添加到項目中,但沒有將其添加到我的可執行目標中,但Xcode/lldb仍然不'查看'源或找出我添加到項目中的源文件Qt調試符號中引用的相同源文件。

如何告訴Xcode/lldb在哪裏可以找到我正在使用的外部庫的源代碼?

編輯:

就在這裏補充更詳細一點,當我輸入 '目標模塊查找-t QMenuBar' 在Xcode/LLDB控制檯,這是我所看到的:

Best match found in /Users/ted/Documents/Projects/XXX/_build_osx/Output/Debug/XXX.app/Contents/MacOS/XXX: 
id = {0x7100042d49}, name = "QMenuBar", byte-size = 48, decl = qmenubar.h:57, clang_type = "class QMenuBar : public QWidget { 
    static const QMetaObject staticMetaObject; 
    virtual const QMetaObject *metaObject() const; 
    virtual void *qt_metacast(const char *); 
    static QString tr(const char *, const char *, int); 
    static QString trUtf8(const char *, const char *, int); 
    virtual int qt_metacall(QMetaObject::Call, int, void **); 
    static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); 
    explicit QMenuBar(QWidget *); 
    virtual void ~QMenuBar(); 
    QAction *addAction(const QString &); 
    QAction *addAction(const QString &, const QObject *, const char *); 
    QAction *addMenu(QMenu *); 
    QMenu *addMenu(const QString &); 
    QMenu *addMenu(const QIcon &, const QString &); 
    QAction *addSeparator(); 
    QAction *insertSeparator(QAction *); 
    QAction *insertMenu(QAction *, QMenu *); 
    void clear(); 
    QAction *activeAction() const; 
    void setActiveAction(QAction *); 
    void setDefaultUp(bool); 
    bool isDefaultUp() const; 
    virtual QSize sizeHint() const; 
    virtual QSize minimumSizeHint() const; 
    virtual int heightForWidth(int) const; 
    QRect actionGeometry(QAction *) const; 
    QAction *actionAt(const QPoint &) const; 
    void setCornerWidget(QWidget *, Qt::Corner); 
    QWidget *cornerWidget(Qt::Corner) const; 
    NSMenu *toNSMenu(); 
    bool isNativeMenuBar() const; 
    void setNativeMenuBar(bool); 
    QPlatformMenuBar *platformMenuBar(); 
    virtual void setVisible(bool); 
    void triggered(QAction *); 
    void hovered(QAction *); 
    virtual void changeEvent(QEvent *); 
    virtual void keyPressEvent(QKeyEvent *); 
    virtual void mouseReleaseEvent(QMouseEvent *); 
    virtual void mousePressEvent(QMouseEvent *); 
    virtual void mouseMoveEvent(QMouseEvent *); 
    virtual void leaveEvent(QEvent *); 
    virtual void paintEvent(QPaintEvent *); 
    virtual void resizeEvent(QResizeEvent *); 
    virtual void actionEvent(QActionEvent *); 
    virtual void focusOutEvent(QFocusEvent *); 
    virtual void focusInEvent(QFocusEvent *); 
    virtual void timerEvent(QTimerEvent *); 
    virtual bool eventFilter(QObject *, QEvent *); 
    virtual bool event(QEvent *); 
    void initStyleOption(QStyleOptionMenuItem *, const QAction *) const; 
    QMenuBarPrivate *d_func(); 
    const QMenuBarPrivate *d_func() const; 
    QMenuBar(const QMenuBar &); 
    QMenuBar &operator=(const QMenuBar &); 
}" 

很明顯,我的可執行文件中有一些符號。這是說這個定義來自qmenubar.h。我的硬盤上有qmenubar.h - 我該如何告訴Xcode/lldb在哪裏找到它?

在Windows的Visual Studio中,如果我點擊堆棧跟蹤中沒有Visual Studio可以輕鬆找到的源的框架,VS會彈出一個窗口,要求我瀏覽源文件 - 從此開始,Visual Studio似乎認爲源代碼的其餘部分基於您瀏覽的源位置。例如,如果我有一個QMenuBar :: focusInEvent()的堆棧跟蹤,並且我點擊它,Visual Studio會問我在哪裏qmenubar.cpp。我可以瀏覽到C:\ Users \ ted \ Downloads \ qt5-everywhere-src-5.3.2 \ qtcore \ src \ qmenubar.cpp(或任何位置),然後Visual Studio假定其他源可能位於附近。

這與Xcode的工作原理是什麼?

+0

只是一個猜測,難道是因爲你鏈接到qt版本庫而不是相應的調試版本?我在這裏找到了一些東西:http://www.qtcentre.org/threads/1334-Compiling-with-debug-symbols-without-needing-QT-debug-libraries似乎你需要'CONFIG + = debug'在你的'.pro '文件。此外,相關:https://forum.qt.io/topic/24972/cannot-step-into-qt-sources-install-qt-debug-symbols-with-web-installer/7 – vsoftco

+0

不 - 使用調試庫。我在調試和發佈Qt版本中都有調試符號。另外,我沒有使用qmake - 這是一個原生的Xcode項目。這是一個任何人都可能遇到的問題,你需要鏈接到一個圖書館,但你仍然有來源。我們也使用谷歌協議緩衝區,提升等,我也有這些相同的問題。 –

+0

可能相關[如何將調試符號與源代碼匹配](https://stackoverflow.com/questions/18903782/how-to-match-precompiled-static-librarys-debugging-symbols-to-source-code-with?lq = 1) –

回答

2

我想我已經找到了我的問題的答案,但它實際上只是導致更多的問題。見Xcode equivalent of Visual Studio's "Find Source"

我在想,也許我的程序或者我的內部版本Qt 沒有有符號,或者少於必要的符號。特別是,這裏有target modules lookup --address <address> --verbose輸出(image爲​​一個LLDB代名詞)在該鏈接SO問題:

(lldb) image lookup -va main 
    Address: hello[0x0000000100000f40] (hello.__TEXT.__text + 0) 
    Summary: hello`main at hello.c:5 
    Module: file = "/private/tmp/hello", arch = "x86_64" 
CompileUnit: id = {0x00000000}, file = "/tmp/hello.c", language = "ISO C:1999" 
    Function: id = {0x00000026}, name = "main", range = [0x0000000100000f40-0x0000000100000f6d) 
    FuncType: id = {0x00000026}, decl = hello.c:4, clang_type = "int (void)" 
    Blocks: id = {0x00000026}, range = [0x100000f40-0x100000f6d) 
    LineEntry: [0x0000000100000f40-0x0000000100000f56): /tmp/hello.c:5 
    Symbol: id = {0x00000004}, range = [0x0000000100000f40-0x0000000100000f6d), name="main" 

這裏是從LLVM網頁上的「LLDB調試器」(http://lldb.llvm.org/symbolication.html)的示例:

>(lldb) image lookup --address 0x100123aa3 --verbose 
     Address: a.out[0x0000000100000aa3] (a.out.__TEXT.__text + 110) 
     Summary: a.out`main + 50 at main.c:13 
     Module: file = "/tmp/a.out", arch = "x86_64" 
    CompileUnit: id = {0x00000000}, file = "/tmp/main.c", language = "ISO C:1999" 
    Function: id = {0x0000004f}, name = "main", range = [0x0000000100000bc0-0x0000000100000dc9) 
    FuncType: id = {0x0000004f}, decl = main.c:9, clang_type = "int (int, const char **, const char **, const char **)" 
     Blocks: id = {0x0000004f}, range = [0x100000bc0-0x100000dc9) 
       id = {0x000000ae}, range = [0x100000bf2-0x100000dc4) 
    LineEntry: [0x0000000100000bf2-0x0000000100000bfa): /tmp/main.c:13:23 
     Symbol: id = {0x00000004}, range = [0x0000000100000bc0-0x0000000100000dc9), name="main" 
    Variable: id = {0x000000bf}, name = "path", type= "char [1024]", location = DW_OP_fbreg(-1072), decl = main.c:28 
    Variable: id = {0x00000072}, name = "argc", type= "int", location = r13, decl = main.c:8 
    Variable: id = {0x00000081}, name = "argv", type= "const char **", location = r12, decl = main.c:8 
    Variable: id = {0x00000090}, name = "envp", type= "const char **", location = r15, decl = main.c:8 
    Variable: id = {0x0000009f}, name = "aapl", type= "const char **", location = rbx, decl = main.c:8 

,這裏是我的Qt5Widgets QMenuBar地址的輸出:

(lldb) image lookup --address 0x103058d57 --verbose 
     Address: libQt5Widgets_debug.5.dylib[0x000000000026dd57] (libQt5Widgets_debug.5.dylib.__TEXT.__text + 2525127) 
     Summary: libQt5Widgets_debug.5.dylib`QMenuBar::actionEvent(QActionEvent*) + 711 
     Module: file = "/Users/ted/Documents/Projects/work/third_party/qt/5.3.2/osx/x86_64/lib/libQt5Widgets_debug.5.dylib", arch = "x86_64" 
     Symbol: id = {0x0000c190}, range = [0x0000000103058a90-0x0000000103059260), name="QMenuBar::actionEvent(QActionEvent*)", mangled="_ZN8QMenuBar11actionEventEP12QActionEvent" 

確認!源文件(CompileUnit)引用在哪裏?感謝@vsoftco的建議以及看到此問題的任何其他人。我將不得不深入到Qt5構建系統中,並找出這些符號的位置。

相關問題