在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
捆绑包的内容中是可行的,但我对此不太满意,所以我寻找其他解决方案。当lldb
在Xcode
调试会话中处于活动状态时,您可以通过使用lldb命令script
来启动交互式解释器,这与从命令行使用python
的体验完全相同。然后在Xcode
的lldb 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说,它的原始环境正在被打开,所以我只想结束这个循环,因为我在没有一个工作示例的情况下就把它扔了出去。
在研究这一点的时候,我读到了其他答案,即在方案设置中的某个地方可以指定一个按方案的lldb
init文件。我把这一发现留给读者练习,但这可能也是一个很好的选择。
多亏了@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等