在 Cloud Debugger 中 设置调试 并部署或启动应用后,您可以在 源代码控制台 中获取或查看调试快照。
快照概览
快照捕获应用源代码中特定行位置的局部变量和调用堆栈。您可以根据条件和指定的行位置返回应用状态的快照。快照详细信息可以帮助您调试代码。
设置行位置几秒钟后,快照设置将应用于应用的所有正在运行的实例。任意实例首次在您设置的快照位置执行代码时,Debugger 都会获取快照并使其可供查看。Debugger 实施了几种策略来最小化捕获数据时产生的延迟时间。
在调试器初始化期间,启动过程中可能无法使用快照。
截取调试快照
在 Google Cloud Console 中,打开 Cloud Source Repositories。
所有代码库 页面打开。或者,您可以打开 我的源代码 视图。
点击代码库的名称,然后转到包含要观看的源代码的文件。
点击源代码位置的行号。
出现提示时,选择要调试的应用,然后点击 继续。
点击创建快照。
新快照会显示在 Google Cloud Console 旁边的窗格中。
快照条件(可选)
快照条件是一个表达式,必须对其取值为 true
才能拍摄快照。支持 Java,Python 和 Go 中的表达式。每次任何实例运行该行时都会评估快照条件,直到条件评估为 true
或快照超时为止。
快照条件是一个完整的布尔表达式,可以包含逻辑运算符:
travelAccessory == "Towel"
ultimateAnswer <= 42
travelAccessory == "Towel" && ultimateAnswer <= 42
设置快照条件
在 GCP Console 中,点击 快照 标签,然后选择一个快照。
快照 面板打开后,点击编辑快照。
在 条件 字段中,输入快照条件。
点击更新。
您可以使用以下语言功能来表达条件:
Java
支持大多数 Java 表达式,包括:- 本地变量:
a == 8
。 - 数值和布尔运算:
x + y < 20
。 - 实例和静态字段:
this.counter == 20
、this.myObj.isShutdown
、myStatic
或com.mycompany.MyClass.staticMember
。 - 字符串与等式运算符的比较:
myString == "abc"
。 - 函数调用。只能使用只读函数。例如,支持
StringBuilder.indexOf()
,但不支持StringBuilder.append()
。 - 类型转换,具有完全限定类型:
((com.myprod.ClassImpl) myInterface).internalField
。
不支持以下语言功能:
- 取消装箱数值类型,例如
Integer
;改用myInteger.value
。
Python
支持大多数 Python 表达式,包括:- 读取局部变量和全局变量。
- 从数组、列表、切片、字典和对象中读取。
- 调用简单的方法。
不支持以下语言功能:
- 调用分配新对象或使用复杂构造的函数。
- 在表达式中创建新对象。
Go(测试版)
支持大多数 Go 表达式语法,包括:- 读取局部变量和全局变量。
- 从数组、切片、映射和结构体中读取。
不支持以下语言功能:
- 从接口值读取。
- 类型转换和复合文字。
- 除
len
之外的函数调用。
表达式(可选)
快照表达式使您可以在拍摄快照时评估复杂的表达式或遍历对象层次结构。表达式支持与上述 快照条件 相同的语言功能。
以下是表达式的典型用法:
查看不属于局部变量集的静态或全局变量。
查看深层嵌套的成员变量,而不必每次都在调试器面板中扩展局部变量。
避免重复的数学计算。例如,使用
(endTimeMillis - startTimeMillis) / 1000.0
计算持续时间(以秒为单位)。
添加一个表达式
在 GCP Console 的下部窗格中,点击 快照 标签,然后选择一个快照。
在打开的面板中,点击 编辑快照。
在 表达式 字段中,输入表达式。
如果您想要添加表达式,请按 Tab 键。
点击更新。
查看快照
应用在您指定的位置运行代码后,快照数据将显示在源代码控制台中。
在 GCP Console 的下部窗格中,点击 快照标签,然后选择一个快照。
包含快照详细信息的面板在快照代码位置显示实例变量的值和堆栈跟踪。
您可以在截取快照时检查局部变量的值,并深入研究更深层次的数据结构。您还可以点击任何调用堆栈帧,并检查堆栈中该级别的局部变量。
重新截取快照
快照只截取一次。要在同一位置捕获应用状态的另一个快照,请按照以下步骤操作:
在 GCP Console 的 快照 面板中,将指针停留在快照上。
点击 重入。
移除快照位置
在 GCP Console 的快照面板中,将指针停留在快照上。
点击删除 delete。
共享快照
您可以通过从浏览器共享快照网址来共享快照。您还可以保存此网址以供日后参考,并再次返回以查看其结果。Debugger 为每个截取的快照使用一个新网址。 这让您可以共享不同的结果集,即使它们是在代码的同一位置截取的。