快速入门

本快速入门介绍如何使用 Cloud Debugger 调试在 App Engine 上运行的简单 Python 应用的状态。本快速入门介绍如何完成以下操作:

  • 检查本地变量和调用堆栈
  • 生成日志语句
  • 设置快照条件并使用表达式

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Cloud Console 的项目选择器页面上,选择或创建 Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

  4. 安装并初始化 Cloud SDK
  5. 确保在本地系统上安装了以下软件:

将示例应用部署到 App Engine

首先将 Python 3.7 应用部署到 App Engine。

  1. 将该应用克隆到您的本地计算机:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. 导航到包含该应用的目录:

    cd python-docs-samples/appengine/standard_python3/cloud_debugger
    
  3. 通过发出以下命令将应用部署到 App Engine:

    gcloud app deploy
    

    系统提示时,选择您要在哪个区域部署自己的 App Engine 应用。

  4. 通过发出以下命令来查看应用:

    gcloud app browse
    

    如果浏览器窗口未自动打开来显示应用,请点击终端中显示的网址。

    应用会提示您在已预填充数据的字段中输入一个字符串。

    示例应用会显示一个提交按钮以及预填充了“abcd”的字段。

  5. 点击提交

    示例应用的输出显示两个结果:程序输出和正确输出。

点击“提交”之后可以看到两个结果。一个标记为程序输出,显示源代码中的 Reverse 方法生成的输出。另一个标记为正确输出,它是 Python 的反向列表功能的输出。

程序输出正确输出应当相同。但现在源代码有问题。需要使用 Debugger 来诊断问题。

查看部署的源代码

部署应用后,您可以在 Google Cloud Console 的调试页面上查看部署的源代码。

  1. 导航至 Google Cloud Console 中的调试页面:

    转到“调试”页面

  2. 请确保您选择了正确的项目:

    显示已选择正确项目的突出显示项目选择器下拉菜单。

  3. 通过验证是否已选择部署的文件并且应用的文件是否存在,来确认 Debugger 有权访问部署的文件:

    下拉菜单显示已选择部署的文件。

  4. 请确保选择了正确的应用版本:

    下拉菜单显示已选择正确的应用版本。

    App Engine 会维护所有已部署的应用版本。使用 Debugger 时,请验证您是否选择了正确的应用版本。

    选择 main.py 文件后,您将看到以下代码块:

    try:
      import googleclouddebugger
      googleclouddebugger.enable()
    except ImportError:
       pass
    
    import logging
    logging.basicConfig(level=logging.INFO)
    

    下面的部分使用 try 和 except 块来导入并启用 Debugger 代理:

    try:
      import googleclouddebugger
      googleclouddebugger.enable()
    except ImportError:
       pass
    
    下面的部分用于配置日志记录:

    import logging
    logging.basicConfig(level=logging.INFO)
    

现在,您已准备好截取调试快照并注入调试日志点,以便诊断源代码的问题。

截取调试快照

调试快照可以捕捉范围中某个代码行位置的局部变量和调用堆栈。

  1. 要截取调试快照,请点击 tmp 变量所在的行号。一个蓝色箭头即会显示,表示已设置快照,并且结果面板会显示“正在等待快照触发”。

    Debugger 界面显示第 47 行已设置快照。

  2. 要触发快照,请刷新页面。

    变量窗格显示变量的值。您可以看到通过第一遍循环时已正确填充 chars 数组。这里不存在该问题,因为快照是在第一次触发断点时截取的。

    结果面板显示截取快照后的变量值。

    调用堆栈窗格显示调用堆栈的结果。您可以点击调用堆栈窗格中的函数,以在代码中查看该时间点的本地变量和参数。点击 ReverseString 后,您将看到输入内容正确无误。

    结果面板显示截取快照之后调用堆栈的值。

由于通过截取快照和检查变量以及调用堆栈并未发现问题,因此需要使用日志点来查明问题。

注入调试日志点

借助调试日志点,您可以将日志记录注入正在运行的应用,而无需重新启动应用。

  1. 要插入日志点,请选择日志点标签页。

  2. 点击 tmp 变量所在的行号。系统会显示一个内联文本框。如下所示填写各个字段,然后点击添加

    if (True) logpoint("About to swap two characters. Chars is currently {chars}")
    

    第 47 行设置了一个日志点。

    日志点的结构为:if(condition)logpoint(string)。要创建日志点,您需要提供两个部分:

    • 条件:必须以源代码的语法编写。

    • 字符串:可包含以源代码语法编写的任意数目的表达式并用大括号括起来。

  3. 要验证是否成功注入了日志点,请选择日志点历史记录标签页。

    “日志点历史记录”标签页显示第 18 行已设置日志点。

  4. 要触发该日志点,请刷新页面。

  5. 要查看日志点生成的日志,请选择日志面板,然后点击刷新

    “日志”标签页显示日志点结果。

诊断问题

这些日志点表示 while 循环执行了三次,但原本只需要执行两次。由于日志点设置在循环开头处,因此它记录了应用即将对已经完全反向的字符串执行字符交换操作。

日志显示 while 循环执行了三次。

要查明问题,需使用带有条件的调试快照。

截取使用条件的调试快照

应用使用 left 变量和 right 变量来跟踪何时停止交换值。当 left 变量大于 right 变量时,循环应当终止。

您可以将快照设置为根据源代码中的条件来触发。您知道循环何时应当终止,因此请使用带有条件的快照来找出问题。

  1. 要确定循环执行次数过多的原因,请将快照设置为根据以下条件来触发:left > right。然后点击相机图标 ,让 Debugger 准备好截取快照。

    使用条件语句在第 47 行设置快照。

  2. 通过刷新页面来触发快照。变量窗格显示 left 变量大于 right 变量。

    在循环中,由于这个时间点的 left 变量已经大于 right 变量,因此随着循环继续进行,它将在到达第 50 行并退出循环之前再次交换值。

    变量窗格显示变量的值。

截取使用表达式的调试快照

Debugger 还可让您在触发快照时检索编程语言表达式。例如,您可以使用 chars[1]chars[2] 之类的表达式来检索 chars 数组中的值。

  1. 要在触发快照时获取表达式的值,请在表达式字段中写入表达式。您可以输入多个表达式。

    快照触发后,表达式值将显示在变量窗格上方。

    表达式字段的结果会显示值“c”和“b”。

解决问题

快照和日志点可帮助诊断应用的问题。在此示例中,while 循环执行的次数过多,因为停止循环的语句 if left >= right: break 太靠后,无法停止最后一次循环。要解决此问题,请将第 50 行的 if left >= right: break 移到第 47 行。

清理

为避免系统因本快速入门中使用的资源向您的 Google Cloud 帐号收取费用,请按照以下步骤操作。

  1. 导航至 Cloud Console 的项目页面。

  2. 点击项目旁边的删除

  3. 输入您的项目名称以确认将其关停。

后续步骤