使用Xcode 11和DataFormatter调试Qt应用程序



在Xcode中调试Qt应用程序时,要查看QString/QList等的内容,我将lldbinit-Xcode设置为使用Qt创建者的lldbbridge.py。对于以前的Xcode版本,这是有效的。

使用

  • Xcode 11.4
  • 问题5.14.2或5.9.9
  • Qt创建者4.11.2
  • macOS 10.15.4

lldbinit Xcode内容:

command script import /Development/Qt/Qt Creator.app/Contents/Resources/debugger/lldbbridge.py

将项目Scheme中的"LLDB Init File"设置为"lldbinit Xcode"显示:

error: type summary add takes one or more args.
File "<string>", line 1
<class.__doc__
^
SyntaxError: invalid syntax
warning: The provided class does not exist - please define it before attempting to use this synthetic provider
@
lldbversion="lldb-1103.0.22.4
Apple Swift version 5.2 (swiftlang-1103.0.32.1 clang-1103.0.32.29)"@
@
state="enginesetupok"@
error: type summary add takes one or more args.
File "<string>", line 1
<class.__doc__
^
SyntaxError: invalid syntax
warning: The provided class does not exist - please define it before attempting to use this synthetic provider
Qt summary provider requires the pygdbmi module, please install using 'sudo /usr/bin/easy_install pygdbmi', and then restart Xcode.

在Qt Creator 4.10.0中,lldbbridge.py和lldb的python版本出现了问题,但此问题已得到修复(https://bugreports.qt.io/browse/QTCREATORBUG-22955)。

将lldb-python版本设置为2(defaults write com.apple.dt.lldb DefaultPythonVersion 2)不会显示任何错误,但也不会显示任何QString内容。

我也必须easy_install pygdbmi吗?但是在哪个python中安装到哪个位置?

是的,您需要安装pygdbmi:

pip3 install pygdbmi

由于某些原因,在标准位置找不到它,所以只需将它从site-packages复制到lldbbridge.py所在的debuggers文件夹即可。

然后,将lldb切换回Python3:

defaults write com.apple.dt.lldb DefaultPythonVersion 3

最后,由于lldbbridge.py是基于Python2的,因此需要对其进行一些修补才能正常工作:

@@ -2214,7 +2214,7 @@

if encoding in text_encodings:
try:
-                    binaryvalue = summaryValue.decode('hex')
+                    binaryvalue = bytearray.fromhex(summaryValue)
# LLDB expects UTF-8
return ""%s"" % (binaryvalue.decode(encoding).encode('utf8'))
except:

重新启动Xcode,Qt调试助手现在应该可以工作了(在macOS 10.15.7上用Xcode 12.3测试)

这本身并不是一个新答案,而是对之前答案的更新。denis.gz表明,Xcode或其lldb中可能存在错误,其python解释器无法找到模块pygdbmi。这也是我的经历,因为它对我也不起作用,但回答这个问题的人为什么会";pip安装";Python内部引发SyntaxError?对如何在python解释器中运行pip有一些有趣的想法。为什么要这样做,尤其是当您必须退出该会话才能导入已安装的模块时?因为Xcode lldb Python解释器本身就是一个完整的环境,它有自己的sys.path,完全指向Xcode.app包。这就是为什么它不能"参见";您安装的pygdbmi版本。人们可能会争论这是否是一个bug,但它需要一些解决方案,因为Qt的lldbbridge.py工具需要pygdbmi。我相信denis.gz建议将安装的模块从pip的安装位置复制到Qt Creator.app捆绑包的内容中是可行的,但我对此不太满意,所以我寻找其他解决方案。当lldbXcode调试会话中处于活动状态时,您可以通过使用lldb命令script来启动交互式解释器,这与从命令行使用python的体验完全相同。然后在Xcodelldb python环境中运行python解释器。使用上面SO问题的回答者建议的解决方案,您可以在lldb python解释器-中按照以下顺序直接安装到该环境中

import pip._internal as pip
pip.main([ "install", "pygdbmi" ])

现在pygdbmi隐藏在Xcode的束中,并且所有lldb python都可以访问。这很酷,但实际上并不比将已安装的pygdbmi复制到Qt Creator.app的捆绑包中好多少。如果你要更新你的Xcode(这种情况多久发生一次?),这个修复程序可能不会像更新Qt Creator时那样坚持下去。因此,我后来想到了以下内容(但还没有尝试):您可以从lldb命令行在lldb-python中运行一个脚本,其中可以将以下内容放入.lldbinit文件-中

script -l python -- sys.path += [ "directory/with/your/modules" ]

给定的路径将在Xcode束之外,Xcode可能会否定这一点,但Xcode的设置说明了一些关于放松";卫生的";构建系统模型,并允许来自更大环境的东西进入。如果你要使用它,我相信上面的方法会以最好的方式完成任务。

编辑:

最后,我建议使用第三条路径,通过更新.lldbinit文件来增加sys.path变量。我试过了,结果成功了。首先是上面的修正。这没有错,但没有必要以上述方式导入pip(import pip._internal as pip)以访问main方法。简单地CCD_ 50就足够了。我在.lldbinit文件中添加的单行是-

script -l python -- import sys; sys.path += [ "/usr/local/lib/python3.9/site-packages" ]

之后,我选择了一个没有安装在Xcode环境中的模块,但作为一个随机示例,它已经安装在我的site-packages-mercurial中的更大环境中。回到Xcode,我启动了script解释器,并且能够在没有任何抱怨的情况下使用import mercurial,并且没有任何特殊的"设置;警告";Xcode说,它的原始环境正在被打开,所以我只想结束这个循环,因为我在没有一个工作示例的情况下就把它扔了出去。

在研究这一点的时候,我读到了其他答案,即在方案设置中的某个地方可以指定一个按方案的lldbinit文件。我把这一发现留给读者练习,但这可能也是一个很好的选择。

多亏了@cyccollins,我找到了一个可行的解决方案。与此同时,我正在使用

  • Xcode 12.5
  • 问题5.15.2
  • Qt Creator 5.0
  • macOS 11.6

.lldinit Xcode

# pygdbmi isn't part of Xcodes/lldb/python config. Import it from an existing path
# make sure to have a similar python version for Xcode:
# script import sys; print(sys.version); print(sys.path)
# install pygdbmi for this installation: /usr/local/Cellar/python@3.8/3.8.12/bin/pip3 install pygdbmi
script import sys; sys.path += [ "/usr/local/lib/python3.8/site-packages" ]
# ATTENTION, disables automatic loading of Python modules for DSYM!
settings set target.load-script-from-symbol-file false
command script import "/usr/local/Trolltech/Qt/Qt Creator.app/Contents/Resources/debugger/lldbbridge.py"
# requires 'defaults write com.apple.dt.lldb DefaultPythonVersion 3'

/usr/local/Trolltech/Qt/Qt Creator.app/Contents/Resources/debugger/lldbbridge.py存在QString的输出问题(https://forum.qt.io/topic/118520/debugger-lldbbridge-py-used-with-xcode-11-6-issues-from-qt-creator-4-13)。在开头添加import codecs并应用此修改:

if encoding in text_encodings:
try:
-                    binaryvalue = summaryValue.decode('hex')
-                    # LLDB expects UTF-8
-                    return ""%s"" % (binaryvalue.decode(encoding).encode('utf8'))
+                    binaryvalue = bytes.fromhex(summaryValue)
+                    return ""%s"" % (codecs.decode(binaryvalue, encoding))
except:
return "<failed to decode '%s' as '%s'>" % (summaryValue, encoding)

至少它对QString、QVector、QList、QVariant再次起作用。仍然不适用于QVector、QMap、QVariantList等

相关内容

  • 没有找到相关文章

最新更新