Qt Creator 调试器未显示返回值
Posted
技术标签:
【中文标题】Qt Creator 调试器未显示返回值【英文标题】:return value not shown by Qt Creator debugger 【发布时间】:2019-01-29 12:32:45 【问题描述】:我的环境:
Windows 10,64 位 Microsoft Visual Studio 2015 更新 3 Qt 5.6.2 Qt Creator 4.8.1根据 Qt Creator 文档,应该可以让 Qt Creator 的调试器在退出函数时显示函数返回的值。摘自http://doc.qt.io/qtcreator/creator-debug-mode.html#local-variables-and-function-parameters:
Locals 视图由 Locals 窗格和 Return Value 窗格(为空时隐藏)组成。
当程序在调试器的控制下停止时,它会检索有关最顶层堆栈帧的信息并将其显示在 Locals 视图中。 Locals 窗格显示有关该框架中函数的参数以及局部变量的信息。如果调试器中的最后一个操作是在按 Shift+F11 后从函数返回,则“返回值”窗格将显示该函数返回的值。
问题是,我看不到返回窗格(以及最后一个函数返回的值)。
这是一个最小的例子:
编译了一个最小的项目后,我在main()
中设置了一个断点,此时foo()
即将被调用,并启动调试器(F5)。调试器在断点处正确停止:
我向调试器发出命令Step Into (F11)。在调试器中,我可以看到控件到达被调用函数foo()
:
现在是关键步骤。我向调试器发出命令 Step Out (Shift+F11)。正如预期的那样,控制权返回给调用者 (main()
),但 foo()
返回的值没有显示:
那么,如何查看返回值呢?
这是我的编译输出窗格的内容:
15:45:44: Running steps for project debugger_return_pane...
15:45:44: Starting: "C:\Qt\5.6.2\msvc2015_64\bin\qmake.exe" C:\experiments\debugger_return_pane\debugger_return_pane.pro -spec win32-msvc2015 "CONFIG+=debug" "CONFIG+=qml_debug"
15:45:44: The process "C:\Qt\5.6.2\msvc2015_64\bin\qmake.exe" exited normally.
15:45:44: Starting: "C:\Qt\Tools\QtCreator\bin\jom.exe" -f C:/experiments/build-debugger_return_pane-Desktop_Qt_5_6_3_MSVC2015_64bit2-Debug/Makefile qmake_all
jom 1.1.2 - empower your cores
15:45:45: The process "C:\Qt\Tools\QtCreator\bin\jom.exe" exited normally.
15:45:45: Starting: "C:\Qt\Tools\QtCreator\bin\jom.exe"
C:\Qt\Tools\QtCreator\bin\jom.exe -f Makefile.Debug
cl -c -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zc:throwingNew -Zi -MDd -GR -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -EHsc /Fddebug\DebuggerReturnPane.vc.pdb -DUNICODE -DWIN32 -DWIN64 -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I..\debugger_return_pane -I. -I..\..\Qt\5.6.2\msvc2015_64\include -I..\..\Qt\5.6.2\msvc2015_64\include\QtWidgets -I..\..\Qt\5.6.2\msvc2015_64\include\QtGui -I..\..\Qt\5.6.2\msvc2015_64\include\QtANGLE -I..\..\Qt\5.6.2\msvc2015_64\include\QtCore -Idebug -I..\..\Qt\5.6.2\msvc2015_64\mkspecs\win32-msvc2015 -Fodebug\ @C:\Users\dave\AppData\Local\Temp\main.obj.8348.0.jom
main.cpp
link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST:embed /OUT:debug\DebuggerReturnPane.exe @C:\Users\dave\AppData\Local\Temp\DebuggerReturnPane.exe.8348.78.jom
15:45:45: The process "C:\Qt\Tools\QtCreator\bin\jom.exe" exited normally.
15:45:45: Elapsed time: 00:01.
【问题讨论】:
代码似乎被编译器优化了,你能告诉我们cl -c ...
在compilation tab
中使用的命令行吗?
我刚刚将我的 编译输出 窗格的内容添加到我原来的帖子中。
您可以通过在您的 .pro 文件中添加以下内容来禁用代码优化:QMAKE_CXXFLAGS_DEBUG += -Od
(带有调试配置,用于 C++ 源文件)
正如预期的那样,将-Od
添加到QMAKE_CXXFLAGS_DEBUG
并没有帮助:行为与我原来的帖子完全相同。 (正如预期的那样,因为-Od
是默认值。)
【参考方案1】:
这已被确认为 Qt Creator 中的一个错误:https://bugreports.qt.io/browse/QTCREATORBUG-21913
【讨论】:
【参考方案2】:在文件的顶部,您需要以这种方式包含 QDebug:
包括
所以在返回之前你需要用这种方式打印 foo 函数返回的值:
qDebug()
【讨论】:
按照您的建议,打印到控制台可能很有用,但完全不同。我希望看到的是每个函数的返回值,因为正在调试代码。这在大多数调试器中是可能的,在 Qt Creator 中也应该是可能的(根据 Qt Creator 手册),但由于某种原因对我不起作用。【参考方案3】:对我有用,在调试器停止到第 8 行后,F10(Step Over),如您所见,返回值显示在右侧面板上enter image description here
【讨论】:
您看到的是a
,这是一个局部变量,它恰好被赋值为从foo()
返回的值。调试器有一个功能,可以让您在退出函数时查看函数返回的值。以上是关于Qt Creator 调试器未显示返回值的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 上使用 Qt Creator 进行调试时未显示 QStrings