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

如何在用qt creator调试时显示qstring的值

在 Qt Creator 调试器中查看数组内容

如何完全禁用 Qt Creator 中的 QML 调试器?

在 Qt Creator 调试器“本地和表达式”中显示定制信息

Qt 事件处理和事件过滤器的返回值