如何进行小程序的调试

news2024/11/28 3:49:10

Errno错误码

在使用部分小程序 API / 组件时,抛出的异常(fail 回调 / Promise reject)Error 对象中除了带有 errMsg,还会带有通用错误码 errno

代码示例

wx.openBluetoothAdapter({
  success (res) {
    console.log(res)
  }
  fail (err) {
    console.log(err.errno)
  }
})

背景介绍

errno 错误码的出现是为了解决以下问题:

  • 目前部分 API 在出现错误时,只返回错误信息 errMsg,没有错误码。另一部分 API 虽然有 errCode,但没有形成统一格式规范。
  • 目前有 errCode 的 API 中,不同的 API 失败时返回的 errCode 粒度不同。部分 API 的 errCode 粒度太大,信息不足。
  • 相同的错误在不同的 API 中 errCode 未对齐,不便于开发者记忆和处理。

因此,我们设计了一套拥有统一规范的错误码errno,以帮助开发者更好地开发调试及处理错误。

errno 错误码有如下优点:

  • 在错误码格式上,拥有统一的设计规范。
  • 不同的 API 中出现的相同错误,对应的错误码一致。
  • 错误码中包含 API 类别信息,帮助开发者快速定位问题。
  • 不同 API 中的错误码粒度较为统一。

当 Error 对象中同时有 errno 错误码和 errCode 错误码时,一般以 errno 错误码为准
后续 errno 错误码会逐步推广到所有 API 接口,并取代现有的 errCode 参数,为开发者提供错误信息。

错误码设计

errno 错误码一般为 7 位数,第 1 - 2 位标识 API 接口的一级类目,第 3 - 4 位标识 API 接口的二级类目,第 5 - 7 位表示具体的错误类型。
例如: errno 错误码为 1504003 时,15 表示 API 接口的一级类目为 设备,04 表示 API 接口的二级类目为 NFC,003 表示具体的错误类型。
目前已接入 errno 的 API 接口涉及的类目包括:

  • 一级类目:00 - 通用错误码
  • 一级类目:01 - 基础
    • 二级类目:00 - 通用基础错误
    • 二级类目:03 - 更新
    • 二级类目:09 - 加密
  • 一级类目:06 - 网络
    • 二级类目:00 - 通用网络错误
    • 二级类目:02 - 发起请求
    • 二级类目:03 - 下载
    • 二级类目:04 - 上传
    • 二级类目:06 - mDNS
  • 一级类目:07 - 支付
    • 二级类目:00 - 通用支付错误
    • 二级类目:01 - 支付默认二级类目
  • 一级类目:11 - 媒体
    • 二级类目:07 - 实时音视频
  • 一级类目:13 - 文件
    • 二级类目:00 - 通用文件错误
    • 二级类目:01 - 文件默认二级类目
    • 二级类目:02 - fd接口
  • 一级类目:14 - 开放接口
    • 二级类目:16 - 视频号
  • 一级类目:15 - 设备
    • 二级类目:00 - 通用设备错误
    • 二级类目:04 - NFC
    • 二级类目:05 - Wi-Fi
    • 二级类目:09 - 低功耗蓝牙
    • 二级类目:10 - 蓝牙
  • 一级类目:20 - AI
    • 二级类目:02 - 人脸识别
    • 二级类目:03 - vision kit
    • 二级类目:04 - 机器学习

一级类目与二级类目名称 和 API 接口文档的类目名称基本保持一致。

最佳实践

以 API 接口 openBluetoothAdapter 为例,当蓝牙适配器不可用时,针对 openBluetoothAdapter 接口抛出的异常 Error 对象:

"err":
{
	"errMsg": "openBluetoothAdapter:fail:not available",
	"errCode": 10001,
	"errno": 1500102
}

可以通过以下代码进行异常处理:

wx.openBluetoothAdapter({
  success (res) {
    console.log(res)
  },
  fail (err) {
    // 微信无法使用蓝牙,可引导用户在系统设置中启用蓝牙
    if ( err.errno === 1500102 ) {
        wx.showModal({
            content: '微信无法使用蓝牙,请到系统设置中启用'
        })
    }
  }
})

错误码

vConsole

在真机上,如果想要查看 console API 输出的日志内容和额外的调试信息,需要在点击屏幕右上角的按钮打开的菜单里选择「打开调试」。此时小程序/小游戏会退出,重新打开后右下角会出现一个 vConsole 按钮。点击 vConsole 按钮可以打开日志面板。

小程序和小游戏的 vConsole 展示内容会有一定差别,下图左边是小程序 vConsole,右边是小游戏 vConsole

 

vConsole 使用说明

由于实现机制的限制,开发者调用 console API 打印的日志内容,是转换成 JSON 字符串后传输给 vConsole 的,导致 vConsole 中展示的内容会有一些限制:

  • 除了 NumberStringBooleannull 外,其他类型都会被作为 Object 处理展示,打印对象及原型链中的 Enumerable 属性。
  • Infinity 和 NaN 会显示为 null
  • undefinedArrayBufferFunction 类型无法显示
  • 无法打印存在循环引用的对象
let a = {}
a.b = a
console.log(a) // 2.3.2 以下版本,会打印 `An object width circular reference can't be logged`

针对上述问题,小程序/小游戏在使用 vConsole 时做了一些处理

  • 2.3.2 及以上版本,支持打印循环引用对象。循环引用的对象属性会显示引用路径,@表示对象本身。
const circular = { x: {}, c: {} }
circular.x = [{ promise: Promise.resolve() }]
circular.a = circular
circular.c.x0 = circular.x[0]

console.log(circular)
// "{a: '<Circular: @>', c: {x0: '<Circular: @.x[0]>'}, x: [{promise: '<Promise>'}]}"
  • 2.3.1 及以上版本,支持展示所有类型的数据。基础库会对日志内容进行一次转换,经过转换的内容会使用<>包裹。如:

    • <Function: func>
    • <Undefined>
    • <Infinity>
    • <Map: size=0>
    • <ArrayBuffer: byteLength=10>
    • ...
  • 2.2.3 ~ 2.3.0 版本中,可以展示 ArrayBuffer 和 Function 类型,undefined 会被打印为字符串 'undefined'

注:尽量避免在非调试情景下打印结构过于复杂或内容过长的日志内容(如游戏引擎中的精灵或材质对象等),可能会带来额外耗时。为了防止异常发生,日志内容超过一定长度会被替换为<LOG_EXCEED_MAX_LENGTH>,此时需要开发者裁剪日志内容。

Source Map

目前只在 iOS 6.7.2 及以上版本支持

小程序/小游戏在打包时,会将所有 JavaScript 代码打包成一个文件,为了便于开发者在手机上调试时定位错误位置,小程序/小游戏提供了 Source Map 支持。

在开发者工具中开启 ES6 转 ES5、代码压缩时,会生成 Source Map 的 .map 文件。开发版小程序中,基础库会使用代码包中的 .map 文件,对 vConsole 中展示的错误信息堆栈进行重新映射(只对开发者代码文件进行)。

如果使用外部的编译脚本对源文件进行处理,只需将对应生成的 Source Map 文件放置在源文件的相同目录下

如:

pages/index.js
pages/index.js.map
app.js
app.js.map

开发者工具会读取、解析 Source Map 文件,并进行将其上传

后续可以在小程序后台的运营中心可以利用上传的 Source Map 文件进行错误分析

注意事项

  1. Source Map 文件不计入代码包大小计算,也不会被包含在体验版/正式版代码包中。
  2. inline sourcemap 不计入代码包大小计算。
  3. 开发版代码包中由于包含了 .map 文件,实际代码包大小会比体验版和正式版大。

实时日志

背景

为帮助小程序开发者快捷地排查小程序漏洞、定位问题,我们推出了实时日志功能。开发者可通过提供的接口打印日志,日志汇聚并实时上报到小程序后台。开发者可从We分析“性能质量->实时日志->小程序日志”进入小程序端日志查询页面,或从“性能质量->实时日志->插件日志”进入插件端日志查询页面,进而查看开发者打印的日志信息。

如何使用

小程序/小游戏端

从基础库2.7.1开始,小程序端即可使用实时日志,小游戏端则从基础库2.14.4开始支持。

1、调用相关接口。打日志的接口是wx.getRealtimeLogManager,为了兼容旧的版本,建议使用如下代码封装一下,例如封装在log.js文件里面:

var log = wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : null

module.exports = {
  debug() {
    if (!log) return
    log.debug.apply(log, arguments)
  },
  info() {
    if (!log) return
    log.info.apply(log, arguments)
  },
  warn() {
    if (!log) return
    log.warn.apply(log, arguments)
  },
  error() {
    if (!log) return
    log.error.apply(log, arguments)
  },
  setFilterMsg(msg) { // 从基础库2.7.3开始支持
    if (!log || !log.setFilterMsg) return
    if (typeof msg !== 'string') return
    log.setFilterMsg(msg)
  },
  addFilterMsg(msg) { // 从基础库2.8.1开始支持
    if (!log || !log.addFilterMsg) return
    if (typeof msg !== 'string') return
    log.addFilterMsg(msg)
  }
}

2、在页面的具体位置打印日志:

var log = require('./log.js') // 引用上面的log.js文件
log.info('hello test hahaha') // 日志会和当前打开的页面关联,建议在页面的onHide、onShow等生命周期里面打
log.warn('warn')
log.error('error')
log.setFilterMsg('filterkeyword')
log.addFilterMsg('addfilterkeyword')

完整的例子可以参考代码片段:https://developers.weixin.qq.com/s/aFYw1BmC7eak

插件端

从基础库2.16.0开始支持,插件端也支持了实时日志。为了让日志更具有结构性,以便后续进行更为复杂的分析,因此插件端采用新设计的格式。

1、调用相关接口 wx.getRealtimeLogManager,获取实时日志管理器实例:

const logManager = wx.getRealtimeLogManager()

2、在需要打日志的逻辑中,获取日志实例:

// 标签名可以是任意字符串,一个标签名对应一组日志;同样的标签名允许被重复使用,具有相同标签名的日志在后台会被汇总到一个标签下
// 标签可为日志进行分类,因此建议开发者按逻辑来进行标签划分
const logger = logManager.tag('plugin-onUserTapSth')

3、在合适位置打印日志:

logger.info('key1', 'value1') // 每条日志为一个 key-value 对,key 必须是字符串,value 可以是字符串/数值/对象/数组等可序列化类型
logger.error('key2', {str: 'value2'})
logger.warn('key3', 'value3')
logger.setFilterMsg('filterkeyword') // 和小程序/小游戏端接口一致
logger.setFilterMsg('addfilterkeyword') // 和小程序/小游戏端接口一致

如何查看日志

登录We分析,从“性能质量->实时日志”进入日志查询页面。开发者可通过设置时间、微信号/OpenID、页面链接、FilterMsg内容(基础库2.7.3及以上支持setFilterMsg)等筛选条件查询指定用户的日志信息。如果是插件上报的实时日志,可从“小程序插件->实时日志”进入日志查询页面进行查询。

./log2.png

注意事项

由于后台资源限制,“实时日志”使用规则如下:

  1. 为了定位问题方便,日志是按页面划分的,某一个页面,在一定时间内(最短为5秒,最长为页面从显示到隐藏的时间间隔)打的日志,会聚合成一条日志上报,并且在小程序管理后台上可以根据页面路径搜索出该条日志
  2. 每个小程序账号,We分析基础版每天限制5000条日志,We分析专业版为50000条,且支持购买配置升级或购买额外的上报扩充包。日志根据版本配置,会保留7天/14天/30天不等,建议遇到问题及时定位。
  3. 一条日志的上限是5KB,最多包含200次打印日志函数调用(info、warn、error调用都算),所以要谨慎打日志,避免在循环里面调用打日志接口,避免直接重写console.log的方式打日志。
  4. 意见反馈里面的日志,可根据OpenID搜索日志。
  5. setFilterMsg和addFilterMsg 可设置类似日志tag的过滤字段。如需添加多个关键字,建议使用addFilterMsg。例如addFilterMsg('scene1'), addFilterMsg('scene2'),addFilterMsg('scene3'),设置后在小程序管理后台可随机组合三个关键字进行检索,如:“scene1 scene2 scene3”、“scene1 scene2”、 “scene1 scene3” 或 “scene2”等(以空格分隔,故addFilterMsg不能带空格)。以上几种检索方法均可检索到该条日志,检索条件越多越精准。
  6. 目前为了方便做日志分析,插件端实时日志只支持 key-value 格式。
  7. 实时日志目前只支持在手机端测试。工具端的接口可以调用,但不会上报到后台。
  8. 开发版、体验版的实时日志,不计入相关quota,即无使用上限。

filtermsg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1951933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时间序列分析方法之 -- 指数平滑(Exponential Smoothing)

目录 原理 适用情况 Python 示例代码 结论 原理 指数平滑&#xff08;Exponential Smoothing&#xff09;是一种用于时间序列分析和预测的平滑技术。与简单移动平均&#xff08;SMA&#xff09;和加权移动平均&#xff08;WMA&#xff09;不同&#xff0c;指数平滑通过对最…

VS+opencv+环境配置

下载opencv库。 版本 - OpenCV 下载完了是一个exe文件&#xff0c;&#xff08;可以更换目录&#xff09;直接双击&#xff0c;也就是压缩。 vs配置&#xff1a; 调试-调试属性 点编辑&#xff0c;加入这两个&#xff0c;路径根据自己的opencv库 3、链接器 测试&#xff1a;…

《Java初阶数据结构》----8.<java对象的比较总结>

目录 前言 一、Java对象的比较 1.1基本类型的比较 1.2 对象比较的问题&#xff08;与equals&#xff09; 1.3对象的比较 &#xff08;三种常用方式&#xff09; 1.重写equals方法 2.基于Comparble接口类的比较 3.基于比较器比较&#xff08;Comparator接口&#xff09; …

如何在网站嵌入可填写的PDF表单:2024巴黎奥运会赛程

如何将可填写的 PDF 表单嵌入您的网页&#xff1f;访问者无需下载或注册即可查看并填写。 简单&#xff01;本文以2024巴黎奥运会赛程表单为例&#xff0c;演示如何将其嵌入网页中。您可以在 ONLYOFFICE 表单库免费获取该模板&#xff0c;有白色和紫色两种背景设计。 如何在网站…

uniapp中出现图片过小会与盒子偏离

结论&#xff1a;在image的父盒子中加上display: flex&#xff0c;原因不清楚 出问题的代码和图片如下&#xff1a; <template><view style" background-color: greenyellow; height: 10rpx;width: 10rpx;"><image :src"imgSrc.seatnull" …

UCOS-III 任务调度锁定/解锁接口OSSchedLock/Unlock详解

在实时操作系统中&#xff0c;任务调度是系统实现多任务并发执行的核心机制。但在某些场景下&#xff0c;我们需要临时关闭任务调度&#xff0c;以确保某段代码在执行过程中不被打断。下面将详细介绍这两个接口的应用场景及实现原理。 1. 关闭调度的应用场景 关闭任务调度的主要…

Windows环境下部署本地大模型教程

自ChatGPT在2022年爆发式出圈以来&#xff0c;大模型对人类世界产生了重大影响&#xff0c;无论是在生产、工作、写作方面还是自动驾驶领域&#xff0c;大模型发挥了非常重要的作用。 现各大厂&#xff0c;无论是国内大厂还是国外大厂&#xff0c;都纷纷推出了自己的对话大模型…

服务暴露 traefik

一。traefik 部署 前置资源 还是那个网站&#xff0c;这里复制 entryPoints&#xff0c;进入traefik的大门 可选在哪台机器上部署 traefik 部署 用 Daemonset 的方式是为了&#xff0c;加机器到集群后&#xff0c;能自动部署traefik 到目标机器 注意 8084端口 必须加…

【JVM基础06】——组成-直接内存详解

目录 1- 引言&#xff1a;直接内存概述1-1 直接内存是什么&#xff1f;直接内存的定义(What)1-2 为什么用直接内存&#xff1f;Java程序对直接内存的使用 (Why) 2- ⭐核心&#xff1a;详解直接内存(How)2-1 文件拷贝案例介绍对比常规 IO(BIO) 和 NIO常规 IO 的操作流程NIO 的操…

C++ - char*、const char*、char[]、string

const char* const char* 用来定义字符串常量。 char[ ] char型的字符数组是一种定长的数组&#xff0c;存储指定长度的字符序列&#xff0c;数组中的每个元素都是一个char类型的变量&#xff0c;如&#xff1a; char arr[] {h, a, l, l, o, \0}; char c arr[0]; // 访问…

Spring Boot的Web开发

目录 Spring Boot的Web开发 1.静态资源映射规则 第一种静态资源映射规则 2.enjoy模板引擎 3.springMVC 3.1请求处理 RequestMapping DeleteMapping 删除 PutMapping 修改 GetMapping 查询 PostMapping 新增 3.2参数绑定 一.支持数据类型: 3.3常用注解 一.Request…

[Vulnhub] Raven2 PHPMailer-RCE+MSQP:Mysql权限提升

信息收集 IP AddressOpening Ports192.168.101.160TCP:22,80,111,46606 $ nmap -p- 192.168.101.160 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.7p1 Debian 5deb8u4 (protocol 2.0) | ssh-hostkey: | 1024 26:81:c1:f…

拉提查合创5步玩转git工具协作代码开发

1 工具使用场景 开发团队使用git版本管理工具&#xff0c;进行协作代码开发过程中&#xff0c;最常用的场景为&#xff1a; &#xff08;1&#xff09;拉取代码 将git远端仓库最新代码拉取到本地。 &#xff08;2&#xff09;提交代码 将本地新增修改的代码提交至git远端仓库中…

Spring Cloud微服务项目统一封装数据响应体

在微服务架构下&#xff0c;处理服务之间的通信和数据一致性是一个重要的挑战。为了提高开发效率、保证数据的一致性及简化前端开发&#xff0c;统一封装数据响应体是一种非常有效的实践。本文博主将介绍如何在 Spring Cloud 微服务项目中统一封装数据响应体&#xff0c;并分享…

【优秀python算法毕设】基于python时间序列模型分析气温变化趋势的设计与实现

1 绪论 1.1 研究背景与意义 在气候变化日益受到全球关注的背景下&#xff0c;天气气温的变化已经对人们的生活各方面都产生了影响&#xff0c;人们在外出时大多都会在手机上看看天气如何&#xff0c;根据天气的变化来决定衣物的穿着和出行的安排。[1]如今手机能提供的信息已经…

C++基础知识:函数重载相关注意事项:1.引用作为重载条件,2.2.函数重载遇见函数默认参数。

1.引用作为重载条件 #include<iostream>using namespace std;//1.引用作为重载的条件 //int 和 const int 类型不同&#xff0c;所以可以作用重载条件 void fn(int &a) //int &a10;不合法 //10放在了常量区&#xff0c;而引用要么在栈区&#xff0c;要么在堆区{…

mysql的MHA以及故障模拟

目录 MHA概念 MHA的组件 MHA的特点 实验&#xff1a;搭建完成MHA的架构 实验&#xff1a;主备切换 实验结果 实验&#xff1a;故障切换 实验&#xff1a;故障恢复 MHA概念 MHA&#xff1a;高可用模式下的故障切换&#xff0c;基于主从复制。它解决的是单点故障和主从复…

Ruby、Python、Java 开发者必备:Codigger之软件项目体检

在编程的广阔天地里&#xff0c;Ruby、Python 和 Java 开发者们各自凭借着独特的语言特性&#xff0c;构建着精彩纷呈的应用世界。然而&#xff0c;无论使用哪种语言&#xff0c;确保项目的高质量始终是至关重要的目标。而 Codigger 项目体检则成为了实现这一目标的得力助手&am…

【JS】事件循环

事件循环&#xff08;Event Loop&#xff09; 什么是事件循环 事件循环就是一个执行任务队列的机制 为什么会出现事件循环 为了避免单线程出现阻塞,采用了异步的形式执行任务。为了解决异步任务的问题,采用了事件循环机制。 事件循环的流程 JavaScript是一门单线程的语言…

Chapter 17 Python文件操作(下)

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、文件的写入二、文件的追加 前言 Python作为一种高效且易于学习的编程语言&#xff0c;提供了一系列强大的文件操作功能&#xff0c;使得用户能够轻松地实现文件的读…