在 Xcode 中,如何使用您拥有源代码的外部库进行调试?

2024-01-01

我在 Xcode 中为 OS X 构建了一个大型 C/C++/Objective-C 项目。该项目链接到预构建的 Qt5 库。

这一切都运行得很好,直到出现崩溃并且我得到了包含 Qt 函数的堆栈跟踪。如果我单击 Qt 函数之一的堆栈框架,Xcode/lldb 将显示程序集而不是源代码 - 我使用 Qt 作为外部库,因此我的项目中没有任何 Qt 源代码。我怎样才能解决这个问题?

我尝试将 Qt5 源添加到项目中,而不将其添加到我的可执行目标中,但 Xcode/lldb 仍然无法“看到”源或发现我添加到项目中的源文件是相同的源文件在 Qt 调试符号中引用。

如何告诉 Xcode/lldb 在哪里可以找到我正在使用的外部库的源代码?

EDIT:

只是为了在这里添加更多细节,当我在 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 配合使用?


我想我已经找到了问题的答案,但实际上它只会引发更多问题。看Xcode 相当于 Visual Studio 的“查找源” https://stackoverflow.com/questions/25376333/xcode-equivalent-of-visual-studios-find-source?rq=1.

我在想也许我的程序或者我的 Qt 版本doesn't有符号,或者符号少于必要的符号。特别是,这里的输出target modules lookup --address <address> --verbose (image是 lldb 的同义词target modules)在那个链接的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 网页“The LLDB Debugger”的示例(http://lldb.llvm.org/symbolication.html 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 构建系统并找出这些符号的去向。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Xcode 中,如何使用您拥有源代码的外部库进行调试? 的相关文章

随机推荐

  • 如何将(参考)Quick book 的 dll 添加到 silverlight 项目?

    我正在使用 silverlight 项目 在此我必须使用 Quick books SDK QBFC 但问题是 silverlight 不允许其他组装 因为 Silverlight 使用不同的运行时和常规 Net 框架的子集 这就是为什么我们
  • 在 R 中使用从宽到长的 Reshape [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在 R 中将数据从宽到长重塑 我的宽格式数据如下所示 我有以下数据矩阵 在行中我有不同的公司 在列中有来自不同年份的不同变量 收
  • 如何在 Ubuntu 上托管/发布我的 .Net Core WebAPI?

    我正在学习 Net Core 我使用 ASP Net MVC 开发了 Web 应用程序 因为它可以在本地 IIS 上安装和运行 在 Ubuntu 和 Linux 中托管 发布 Net Core WebApi 的类似方式是什么 而不是在 50
  • 允许使用多个字符进行 C++ 字符初始化 [重复]

    这个问题在这里已经有答案了 在通过阅读书籍学习 C 的过程中 我看到了这行 对我来说 奇怪的代码 char ch AB Or char ch AB 这对我来说很奇怪 因为我不明白你可以分配给char多个 字母 没有任何例外 cout lt
  • Delphi Tokyo 64 位将非正规数刷新为零?

    在短暂查看 system math 的源代码时 我发现 64 位版本 Delphi Tokyo 10 2 3 将非正规 IEEE Doubles 刷新为零 从以下程序中可以看出 apptype console uses system sys
  • 所有可能接触项目后端的开发人员都应该了解哪些有用的 SQL 语句/使用模式?

    所有可能接触项目后端的开发人员都应该了解哪些有用的 SQL 语句 Update 就像在算法中一样 我们知道存在排序问题 洗牌问题 并且我们知道它们的一些解决方案 这个问题是针对同一件事 例如 我能想到的一个是 获取不存在的类的列表 由任何学
  • x86 是否具有原子增量来保留存储的值?

    我已经发现lock inc addr但这并没有保留存储值的副本 甚至同一线程中紧随其后的读取也可能发生在竞争写入之后 我发现的最好的解决方案是load inc cas http en wikipedia org wiki Compare a
  • 使用 ZeroMQ 实现消息总线

    我必须开发一个消息总线 供进程相互发送和接收消息 目前 我们正在Linux上运行 并计划稍后移植到其他平台 为此 我使用 TCP 上的 ZeroMQ 该模式是带有转发器的 PUB SUB 我的总线作为一个单独的进程运行 所有客户端都连接到
  • 如何使用JBoss Tattletale工具?

    我需要减小项目中 JAR 文件的大小 即 9 17MB 我已经减小了它 通过删除所有记录器语句和死代码 将文件大小减少到 6 31MB 我还通过删除并编译每个 JAR 文件来单独检查它 通过它 我删除了最多 6 个文件 现在我想将 JAR
  • 在 Chrome 操作系统上加载本地文件

    我正在尝试创建一个 JavaScript pacman 游戏 但每当我尝试加载脚本文件或图像时 都会收到错误 The browser I m using is chrome and the files are stored in the s
  • 在 Jquery Ui Datepicker 中禁用今天之后的未来日期

    我想在 Jquery Ui Datepicker 中禁用今天之后的所有未来日期 这里是Demo http jsfiddle net X82aC 541 Code start date datepicker maxDate 0 beforeS
  • 如何从 JAX-WS Web 服务中访问 ApplicationContext?

    如同如何从 JAX WS Web 服务中访问 ServletContext https stackoverflow com questions 261348 how can i access the servletcontext from
  • AsyncTaskLoader 基本示例。 (安卓)

    我在我的应用程序中使用 Loader 并根据使用此 Loader 对 COntacts 执行的查询得到的结果 我执行一些计算并将它们存储回 Sqlite DB 中 我希望这个操作是异步的 但是我对使用异步任务感到困惑 因为我有很多不同的数据
  • 带有分隔符作为字符串的字符串列表?

    我在一个存储为字符串的对象中有一个名为 HistoryText 的属性 我想显示网格中的所有行 我应该能够删除和编辑网格中的行 格式为 16 5 2003 12 09 anna Organization created 2 6 2005 1
  • JSF 2.0 使用外部上下文以及 faces-redirect=true 打开新的浏览器窗口

    我正在开发 JSF 2 0 应用程序 单击 时 我在后端 bean 操作中执行一些逻辑 需要重定向到新窗口中的另一个 URL 并在退出操作之前在原始 bean 操作中执行一些清理工作 我目前正在使用 externalContext redi
  • 有多少用户可以打开与 Microsoft Access 的连接?

    有多少用户可以同时打开与 Microsoft Access 数据库的连接 我正在使用 asp net 4 0 来编写我的应用程序
  • nodeschool learnyounode node.js 模块 FILTER LS 练习

    下面是nodeschool learnyounode模块的练习5 创建一个程序 打印给定目录中的文件列表 并按文件扩展名进行过滤 您将获得一个目录名称作为程序的第一个参数 例如 path to dir 和作为第二个参数进行过滤的文件扩展名
  • JavaDoc:在哪里向文档添加注释/评论?

    当用 C 编码时 我总是找到标签remarks对于提供有关类或方法的实现的注释 或者提供有关我正在实现的理论的信息非常有用 我现在使用 Java 但找不到合适的 JavaDoc 标签 也许在 Java 中你可以用不同的方式来完成这个任务 有
  • 如何获得aprun排名

    我正在尝试使用 aprun 运行多节点作业 但是 我不知道如何在 bash 环境中获取排名 或作为每个作业的 ID 的任何内容 就像这个简单的工作 aprun n 8 N 2 examplebashscript sh 我怎样才能获得每个衍生
  • 在 Xcode 中,如何使用您拥有源代码的外部库进行调试?

    我在 Xcode 中为 OS X 构建了一个大型 C C Objective C 项目 该项目链接到预构建的 Qt5 库 这一切都运行得很好 直到出现崩溃并且我得到了包含 Qt 函数的堆栈跟踪 如果我单击 Qt 函数之一的堆栈框架 Xcod