我在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的工作原理是什麼?
只是一個猜測,難道是因爲你鏈接到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
不 - 使用調試庫。我在調試和發佈Qt版本中都有調試符號。另外,我沒有使用qmake - 這是一個原生的Xcode項目。這是一個任何人都可能遇到的問題,你需要鏈接到一個圖書館,但你仍然有來源。我們也使用谷歌協議緩衝區,提升等,我也有這些相同的問題。 –
可能相關[如何將調試符號與源代碼匹配](https://stackoverflow.com/questions/18903782/how-to-match-precompiled-static-librarys-debugging-symbols-to-source-code-with?lq = 1) –