首页 > 其他分享 >5分钟教会你如何在生产环境debug代码

5分钟教会你如何在生产环境debug代码

时间:2024-01-19 13:33:06浏览次数:21  
标签:Initiator 调用 console 代码 教会 debug 源代码

前言

有时出现的线上bug在测试环境死活都不能复现,靠review代码猜测bug出现的原因,然后盲改代码直接在线上测试明显不靠谱。这时我们就需要在生产环境中debug代码,快速找到bug的原因,然后将锅丢出去。

生产环境的代码一般都是关闭source map和经过混淆的,那么如何进行debug代码呢?我一般都是使用这两种方式debug线上代码:“通过console找到源代码打断点”和“通过network面板的Initiator找到源代码打断点”。

通过console找到源代码打断点

打开浏览器控制台的console面板,在上面找到由bug导致抛出的报错信息或者在代码里面通过console.log打的日志。然后点击最右边的文件名称跳转到具体的源码位置,直接在代码中打上断点就可以debug代码了。

如果点击右边的文件名后出现这种404报错的情况。
could-not-load-content-for-webpack://***-(fetch-through-target-failed:-unsupported-url-scheme;-fallback:-http-error:-status-code-404,-net:: ERR_UNKNOWN_URL_SCHEME)

只需要点击控制台右边倒数第三个图标setting(设置),将preferences(偏好设置)中的Enable JavaScript source maps(启用 JavaScript 源代码映射)取消勾选后再重新点console最右边的文件名称即可。

这种方式很简单就可以找到源代码,但是有的bug是没有报错信息的,而且我们也不可能到处都给代码加上console.log,所以这种方式有一定的局限性。

通过network面板的Initiator找到源代码打断点

将鼠标放到请求的Initiator(启动器)后,就会显示当前请求完整的调用链中的方法和函数。假如请求是由A函数中发起的,B函数调用了A函数,C函数又调用了B函数。那么这种情况中Initiator就会按照顺序依次将A、B、C函数都列出来。

了解了Initiator的作用思路就清晰了,我们只需要找到离bug最近的一个接口请求,然后从调用链中找到我们需要的方法或者函数就可以了。

这时有的小伙伴又会说了,线上的代码都是经过混淆的,原本代码中的函数和变量经过混淆后已经都不是原本的名字了,那么我们怎么知道调用栈中哪个是我们想要找的函数呢?

确实函数和变量名称经过混淆后已经变得面目全非了,但是对象中的方法和属性名称是不会被修改的,还是会保留原本的名字。比如我们有一个对象名字叫user,user中有个名叫dance的方法。经过混淆后user对象的名字可能已经变成了U,但是dance方法还是叫原本的名字,不会被修改。利用这一点我们可以在调用栈中找到我们熟悉的对象方法名称就可以很快的定位到源代码。

举个例子,我们当前有个service/common.js文件

import axios from "axios";

const urls = {
  messageList: "http://127.0.0.1:3000/api/getMessageList",
};

const methods = {
  getMessageList() {
    return axios({
      method: "get",
      url: urls.messageList,
    });
  },
};

export default {
  urls,
  methods,
};

业务组件中这样调用

import CommonService from "@/service/common.js";

async function initData() {
  const res = await CommonService.methods.getMessageList();
  const formatData: Array<Message> = handleFormatData(res.data.list);
  messageList.value = formatData;
}

Initiator调用栈中就可以很容易的找到getMessageList方法,并且我们知道getMessageList方法是我们的initData调用的。那么在调用栈中getMessageList的上一个就是我们想要找的源代码位置,点击文件名称就可以跳转到目标源代码具体的位置。

如果跳转到源代码后代码是被压缩的状态,点左下角的花括号将代码格式化。找到具体的定位后,经过比对其实混淆后的代码和源代码其实差别不是特别大,debug代码还是很容易的。

这时有的小伙伴又会问了,假如我们出现bug的地方没有接口请求怎么办呢?

这种情况也可以利用Initiator调用栈找到对应的源代码js文件,然后搜索你知道的属性和方法名字,因为属性和方法名称在混淆的过程中是不会被重写的。这样也可以找到源代码的位置。

总结

这篇文章主要介绍了两种在线上debug源码的方法。第一种方法是在控制台找到console输出,点击console右边的文件名称跳转到源码进行debug。第二种方式通过请求的Initiator调用栈,找到源代码中对应的方法,点击文件名称也可以跳转到源代码具体的位置。

如果我的文章对你有点帮助,欢迎关注公众号:【欧阳码农】,文章在公众号首发。你的支持就是我创作的最大动力,感谢感谢!

标签:Initiator,调用,console,代码,教会,debug,源代码
From: https://www.cnblogs.com/heavenYJJ/p/17974443

相关文章

  • 《模拟龙生》|500行Go代码写一个随机冒险游戏|巨龙修为挑战开启
    一、前言新年就要到了,祝大家新的一年:......
  • 【教程】React-Native代码规范与加固详解
    引言ReactNative是一种跨平台的移动应用开发框架,由Facebook推出。它可以让我们使用JavaScript和React语法编写原生应用,大大提高了移动应用的开发效率。但是,对于开发人员来说,代码规范和安全性也是非常重要的问题。本篇博客将为大家详细介绍ReactNative的代码规范和加固......
  • 代码随想录 day23 修剪二叉搜索树 将有序数组转换为二叉搜索树 把二叉搜索树转换为累
    修剪二叉搜索树这道题不能直接写删除代码因为要涉及父子关系的保留如这样是暴力删掉不符合区间的节点但是没有保留父子关系这里我们把不符合区间的节点通过一个临时节点传递出来然后在外面合适方向接住具体怎么接住的呢其实就是对于root来说左边子树抛出的节点就会......
  • SAS,Stata,HLM,R,SPSS和Mplus分层线性模型HLM分析学生受欢迎程度数据|附代码数据
    全文链接:http://tecdat.cn/?p=10809最近我们被客户要求撰写关于分层线性模型的研究报告,包括一些图形和统计输出。本文用于比较六个不同统计软件程序(SAS,Stata,HLM,R,SPSS和Mplus)的两级分层线性模型的过程和输出下面介绍的六个模型都是两级分层模型的变体,也称为多级模型,这是混合模型......
  • iMessage群发,iMessage群发软件(功能测试与代码调整篇)
    iMessage作为苹果公司的即时通讯工具,已成为许多人日常沟通的首选,而针对这一平台开发的iMessage群发软件,更是受到了广大用户的青睐,这类软件通过自动化操作,实现了批量发送信息的功能,大大提高了沟通效率。一、功能测试示例代码:1、发送速度测试importtimedeftest_send_speed()......
  • 波达方向估计(DOA)-Python代码实现MVDR
    https://mp.weixin.qq.com/s/61I1aBTwJ3ykw0uuceLKkQ模拟一个由三根全向天线组成的阵列,然后使用数组来模拟到达阵列的信号。相邻天线之间:1/2波长(也称为“半波长间隔”)。将模拟发射机的信号以一定角度theta到达该阵列。另外在这个接收到的信号中添加噪声。importnumpyasnp......
  • 编写可读代码的艺术
    写让人理解的代码代码的写法应该使理解代码的人所需要的时间最小化变量名使用专业的词避免使用空泛的词给变量名带上附加信息为作用域更大的变量起一个长的名字有目的的使用大小写和下划线让人不会误解的名字不会误解的名字是最好的名字————阅读代码的人应该理解你......
  • latex中插入latex代码
    导言区插入:\usepackage{listings}%插入代码要引入的宏包\lstset{columns=fixed,basicstyle=\linespread{1.2}\ttfamily,%设置行距,字体numbers=left,%在左侧显示行号numberstyle=\t......
  • ArkTS水果排行榜【代码可执行】
     #ArkTS水果排行榜>代码可执行>分为五个文件>1.FruitDataModel.ets定义app中需要的水果模型>2.TitleComponent.ets定义Title组件>3.TableHeaderComponent.ets定义表头组件>4.ItemComponent.ets定义列表项的子组件>5.Index.etsUI入口组件 FruitDa......
  • 波达方向估计(DOA)-Python代码实现
    https://mp.weixin.qq.com/s/fMGc8ziglySGKr1fY8Jvkw模拟一个由三根全向天线组成的阵列,然后使用数组来模拟到达阵列的信号。相邻天线之间距离为1/2波长(也称为“半波长间隔”)。将模拟发射机的信号以一定角度theta到达该阵列。另外在这个接收到的信号中添加噪声。importnumpy......