【发布时间】:2015-06-11 04:49:18
【问题描述】:
我在 Xcode 中为 OS X 构建了一个大型 C/C++/Objective-C 项目。该项目链接到预构建的 Qt5 库。
这一切都很好,直到发生崩溃,我得到一个包含 Qt 函数的堆栈跟踪。如果我单击其中一个 Qt 函数的堆栈框架,Xcode/lldb 将显示程序集而不是源代码 - 我使用 Qt 作为外部库,因此我的项目中没有任何 Qt 源代码。我怎样才能解决这个问题?
我已尝试将 Qt5 源代码添加到项目中而不将其添加到我的可执行目标中,但 Xcode/lldb 仍然没有“看到”源代码或发现我添加到项目中的源文件是Qt 调试符号中引用的相同源文件。
我如何告诉 Xcode/lldb 在哪里可以找到我正在使用的外部库的源代码?
编辑:
在这里添加更多细节,当我在 Xcode/lldb 控制台中键入“目标模块查找 -t QMenuBar”时,我看到的是:
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发布库而不是相应的调试版本?我在这里找到了一些东西:qtcentre.org/threads/… 似乎您的
.pro文件中需要CONFIG += debug。另外,相关:forum.qt.io/topic/24972/… -
不——使用调试库。实际上,我的调试和发布 Qt 版本中都有调试符号。另外,我没有使用 qmake - 这是一个原生 Xcode 项目。这是任何人都会遇到的问题,您链接到的库但您仍然有源代码。我们还使用 google 协议缓冲区、boost 等,我也有同样的问题。