Chrome DevTools

Chrome Devtools调试技巧 Chrome Devtools的强大之处仍不止这些,敬请关注后面的文章由于图片和格式解析问题,可前往阅读原文。 阅读详情

JavaScript

调试 JavaScript 

第 1 步:重现错误 

    找到一系列能够持续重现错误的操作始终是调试的第一步。在新选项卡中打开【演示】。

第 2 步:熟悉 Sources 面板 UI 

    DevTools 为不同的任务提供了很多不同的工具,例如更改 CSS、分析页面加载性能和监控网络请求。 Sources 面板是您调试 JavaScript 的地方。 

    1,按 Command+Option+I (Mac) 或 Control+Shift+I(Windows、Linux)快捷方式打开控制台面板。

    2,单击【Sources】选项卡。 Sources 面板 UI 有 3 个部分:“文件导航器”窗格。 此处列出了页面请求的每个文件。"代码编辑器"窗格。 在“文件导航器”窗格中选择文件后,该文件的内容将显示在此处。”JavaScript 调试“窗格。 用于检查页面 JavaScript 的各种工具。 如果您的 DevTools 窗口很宽,则此窗格将显示在代码编辑器窗格的右侧。

第 3 步:使用断点暂停代码 

    简而言之,断点可以帮助您比 console.log() 方法更快地找到和修复错误。 

    事件侦听器断点。在 “JavaScript 调试”窗格中,单击事件侦听器断点以展开该部分。 DevTools 显示可扩展事件类别的列表,例如动画和剪贴板。在鼠标事件类别旁边,单击展开。 DevTools 会显示鼠标事件列表,例如 click 和 mousedown。 每个事件旁边都有一个复选框。选中单击复选框。 DevTools 现在设置为在任何单击事件侦听器执行时自动暂停。

第 4 步:单步执行代码 

    错误的一个常见原因是脚本以错误的顺序执行。 单步执行代码使您可以一次一行地遍历代码的方式执行,并准确找出它以与预期不同的顺序执行的位置。 

第 5 步:设置代码行断点 

    代码行断点是最常见的断点类型。 当您有要暂停的特定代码行时,请使用代码行断点:在代码的左侧,您可以看到该特定代码行的行号,即 32。单击 32。DevTools 在 32 的顶部放置一个蓝色图标。这意味着有一个代码行断点。 DevTools 现在总是在执行这行代码之前暂停。 

第 6 步:检查变量值 

    DevTools 提供了许多用于检查变量值的工具。

方法 1:【Scope】窗格。

方法二:观察表达式。 

    Watch Expressions 选项卡让您可以随时间监控变量的值。 顾名思义,监视表达式不仅限于变量。 您可以在 Watch Expression 中存储任何有效的 JavaScript 表达式。 现在就试试: 

方法三:控制台。 

    除了查看 console.log() 消息之外,您还可以使用控制台来评估任意 JavaScript 语句。 在调试方面,您可以使用控制台来测试潜在的错误修复。 现在就试试: 

如果您没有打开控制台抽屉,请按 Escape 将其打开。 它会在您的 DevTools 窗口底部打开。 

第 7 步:应用修复 

    您已找到该错误的修复程序。 剩下的就是通过编辑代码并重新运行演示来尝试您的修复。 您无需离开 DevTools 即可应用此修复程序。 您可以直接在 DevTools UI 中编辑 JavaScript 代码。 现在就试试: 1,单击恢复脚本执行。2,修改错误代码。3,按 Command+S (Mac) 或 Control+S(Windows、Linux)保存更改。4,单击停用断点。设置后,DevTools 会忽略您设置的任何断点。5,尝试使用不同的值进行演示。 演示现在计算正确。 

下一步 

本教程仅向您展示了两种设置断点的方法。 DevTools 提供了许多其他方式,包括:1,条件断点仅在您提供的条件为真时触发。2,捕获或未捕获异常的断点。3,当请求的 URL 与您提供的子字符串匹配时触发的 XHR 断点。 

用断点暂停你的代码 

使用断点暂停您的 JavaScript 代码。 本指南解释了 DevTools 中可用的每种类型的断点,以及何时使用以及如何设置每种类型。 

何时使用每种断点类型的概述 

最著名的断点类型是代码行。 但是设置代码行断点可能效率低下,特别是如果您不知道确切的位置,或者您正在使用大型代码库。 您可以通过了解如何以及何时使用其他类型的断点来节省调试时间。 

断点类型当您想暂停时使用它...
代码行在一个确切的代码区域。
有条件的代码行在确切的代码区域上,但仅当某些其他条件为真时。
DOM在更改或删除特定 DOM 节点或其子节点的代码上。
XHR当 XHR URL 包含字符串模式时。
事件监听器在触发事件(例如单击)之后运行的代码上。
异常在抛出捕获或未捕获异常的代码行上。
函数每当调用特定函数时。

代码行断点

当您知道需要调查的确切代码区域时,使用代码行断点。 DevTools 总是在执行这行代码之前暂停。 

单击【Sources】选项卡。打开包含要中断的代码行的文件。转到代码行。代码行的左侧是行号列。 点击它。 行号列顶部会出现一个蓝色图标。 

代码中的代码行断点,从您的代码中调用调试器以在该行上暂停。 这相当于代码行断点,只是断点设置在您的代码中,而不是在 DevTools UI 中。

console.log('a');
console.log('b');
debugger;
console.log('c');

有条件的代码行断点,当您知道需要调查的确切代码区域,但只想在其他条件为真时暂停时,使用条件代码行断点。

单击【Sources】选项卡。打开包含要中断的代码行的文件。转到代码行。代码行的左侧是行号列。 右键单击它。选择添加条件断点。 代码行下方会显示一个对话框。在对话框中输入您的条件。按 Enter 键激活断点。 行号列顶部会出现一个橙色图标。 

管理代码行断点,使用 Breakpoints 窗格从单个位置禁用或删除代码行断点。 

选中条目旁边的复选框以禁用该断点。右键单击一个条目以删除该断点。右键单击 Breakpoints 窗格中的任意位置以停用所有断点、禁用所有断点或删除所有断点。 禁用所有断点相当于取消选中每个断点。 停用所有断点指示 DevTools 忽略所有代码行断点,但同时保持其启用状态,以便在您重新激活它们时它们处于与之前相同的状态。 

DOM 更改断点

当您想要暂停更改 DOM 节点或其子节点的代码时,请使用 DOM 更改断点。 

单击【Elements】选项卡。转到要设置断点的元素。右键单击该元素。将鼠标悬停在 Break on 上,然后选择子树修改、属性修改或节点移除。 

DOM 更改断点的类型,子树修改。 当移除或添加当前选定节点的子节点或更改子节点的内容时触发。 不会在子节点属性更改或对当前选定节点的任何更改时触发。属性修改:在当前选择的节点上添加或删除属性时触发,或者当属性值更改时触发。节点移除:当当前选中的节点被移除时触发。 

XHR/Fetch断点 

当您想在 XHR 的请求 URL 包含指定字符串时中断时,请使用 XHR 断点。 DevTools 在 XHR 调用 send() 的代码行上暂停。 

这很有用的一个例子是,当您看到您的页面请求的 URL 不正确,并且您想快速找到导致错误请求的 AJAX 或 Fetch 源代码时。 

单击【Sources】选项卡。展开 XHR 断点窗格。单击添加断点。输入要中断的字符串。 当此字符串出现在 XHR 请求 URL 的任何位置时,DevTools 会暂停。按 Enter 确认。 

事件监听断点 

如果您想在触发事件后运行的事件侦听器代码上暂停,请使用事件侦听器断点。 您可以选择特定事件(例如单击)或事件类别(例如所有鼠标事件)。 

单击【Sources】选项卡。展开事件侦听器断点窗格。 DevTools 显示事件类别列表,例如动画。
选中其中一个类别以在触发该类别中的任何事件时暂停,或展开类别并检查特定事件。 

异常断点 

当您想在抛出捕获或未捕获异常的代码行上暂停时,使用异常断点。 

单击【Sources】选项卡。单击异常时暂停。启用时变为蓝色。
(可选)如果除了未捕获的异常之外,还想暂停捕获的异常,请选中 【Pause On Caught Exceptions】 复选框。 

函数断点 

当您想在调用特定函数时暂停时,调用 【debug(functionName)】,其中 functionName 是您要调试的函数。 您可以将 【debug()】 插入您的代码(如 console.log() 语句)或从 DevTools 控制台调用它。 debug() 相当于在函数的第一行设置一个代码行断点。

function sum(a, b) {
  let result = a + b; // DevTools pauses on this line.
  return result;
}
debug(sum); // Pass the function object, not a string.
sum();

确保目标函数在范围内,如果要调试的函数不在范围内,DevTools 会抛出 ReferenceError。

(function () {
  function hey() {
    console.log('hey');
  }
  function yo() {
    console.log('yo');
  }
  debug(yo); // This works.
  yo();
})();
debug(hey); // This doesn't work. hey() is out of scope.

如果您从 DevTools 控制台调用 debug(),确保目标函数在范围内可能会很棘手。 这是一种策略:在函数在作用域内的某处设置一个代码行断点。触发断点。当代码仍然在代码行断点处暂停时,在 DevTools 控制台中调用 debug()。

JavaScript 调试参考 

单步执行代码 

一旦您的代码暂停,请一次一行地单步执行,并在此过程中调查控制流和属性值。 

跳过代码行, 当在包含与您正在调试的问题无关的函数的代码行上暂停时,单击 【Step over S】 以执行该函数而不进入它。

例如,假设您正在调试以下代码: 

function updateHeader() {
  var day = new Date().getDay();
  var name = getName(); // A
  updateName(name); // D
}
function getName() {
  var name = app.first + ' ' + app.last; // B
  return name; // C
}

您在 A 上暂停。通过按 【Step over】,DevTools 会执行您要跳过的函数中的所有代码,即 B 和 C。DevTools 然后在 D 上暂停。

进入代码行,当在包含与您正在调试的问题相关的函数调用的代码行上暂停时,单击 【Step into】 以进一步调查该函数。

例如,假设您正在调试以下代码: 

function updateHeader() {
  var day = new Date().getDay();
  var name = getName(); // A
  updateName(name);
}
function getName() {
  var name = app.first + ' ' + app.last; // B
  return name;
}

您在 A 上暂停。通过按 【Step into】,DevTools 执行这行代码,然后在 B 上暂停。

跳出代码行,当在与您正在与调试的问题无关的函数内暂停时,单击 【Step out】 以执行函数的其余代码。 

例如,假设您正在调试以下代码: 

function updateHeader() {
  var day = new Date().getDay();
  var name = getName();
  updateName(name); // C
}
function getName() {
  var name = app.first + ' ' + app.last; // A
  return name; // B
}

您在 A 上暂停。通过按 【Step out】,DevTools 执行 getName() 中的其余代码,在本例中只是 B,然后在 C 上暂停。 

将所有代码运行到某一行,在调试一个长函数时,可能会有很多与你调试的问题无关的代码。您可以遍历所有行,但这可能很乏味。 您可以在您感兴趣的行上设置一个代码行断点,然后按 【Resume Script Execution】,但有一种更快的方法。 右键单击您感兴趣的代码行,然后选择继续到此处。 DevTools 运行到该点的所有代码,然后在该行上暂停。

恢复脚本执行,要在暂停后继续执行脚本,请单击恢复脚本执行【Resume Script Execution】。 DevTools 执行脚本直到下一个断点(如果有)。 

强制执行脚本,要忽略所有断点并强制您的脚本继续执行,请单击并按住 【Resume Script Execution】,然后选择 【Force script execution】。  

Selecting 'Force script execution'.

更改线程上下文,使用 Web Worker 或 Service Worker 时,单击“线程”窗格中列出的上下文以切换到该上下文。 蓝色箭头图标表示当前选择了哪个上下文。

例如,假设您在主脚本和 Service Worker 脚本中的断点处暂停。 您想查看 Service Worker 上下文的本地和全局属性,但 Sources 面板显示的是主脚本上下文。 通过单击 Threads 窗格中的 service worker 条目,您将能够切换到该上下文。 

查看和编辑本地、闭包和全局属性

在一行代码上暂停时,使用 Scope 窗格查看和编辑本地、闭包和全局范围内的属性和变量的值。双击属性值以更改它。不可枚举的属性显示为灰色。 

查看当前调用堆栈 

在一行代码上暂停时,使用“调用堆栈”窗格查看使您走到这一步的调用堆栈。如果您正在使用异步代码,请选中 Async 复选框以启用异步调用堆栈。单击条目可跳转到调用该函数的代码行。 蓝色箭头图标表示 DevTools 当前突出显示的功能。 

复制堆栈跟踪,右键单击“调用堆栈”窗格中的任意位置,然后选择“复制堆栈跟踪”以将当前调用堆栈复制到剪贴板。 

下面是一个输出示例: 

getNumber1 (get-started.js:35)
inputsAreEmpty (get-started.js:22)
onClick (get-started.js:15)

忽略脚本或脚本模式

在调试时忽略脚本以跳过它。 忽略时,脚本在“调用堆栈”窗格中会变得模糊,当您单步执行代码时,您永远不会进入脚本的函数。 

例如,假设您正在逐步执行以下代码: 

function animate() {
  prepare();
  lib.doFancyStuff(); // A
  render();
}

A 是您信任的第三方库。 如果您确信您正在调试的问题与第三方库无关,那么忽略该脚本是有意义的。

忽略编辑器窗格中的脚本,打开文件。右键单击任意位置。选择添加脚本以忽略列表。 

忽略“调用堆栈”窗格中的脚本,右键单击脚本中的函数。选择添加脚本以忽略列表。

忽略设置中的脚本,打开设置。转到忽略列表选项卡。单击添加模式。输入要忽略的脚本名称或脚本名称的正则表达式模式。单击添加。 

从任何页面运行调试代码片段 

如果您发现自己在控制台中一遍又一遍地运行相同的调试代码,请考虑使用代码段。 代码段是您在 DevTools 中创作、存储和运行的可执行脚本。 

观察自定义 JavaScript 表达式的值 

使用 Watch 窗格来观察自定义表达式的值。 您可以查看任何有效的 JavaScript 表达式。 

单击【添加表达式】以创建新的监视表达式。单击 【Refresh】 以刷新所有现有表达式的值。 单步执行代码时,值会自动刷新。将鼠标悬停在表达式上,然后单击【删除表达式】以将其删除。 

使缩小的文件可读 

单击 【Format】 使缩小的文件可读。 

编辑脚本

在修复错误时,您通常希望测试对 JavaScript 代码的一些更改。 您无需在外部浏览器中进行更改,然后重新加载页面。 您可以在 DevTools 中编辑您的脚本。 

在【Sources】面板的【Editor】窗格中打开文件。在编辑器窗格中进行更改。按 Command+S (Mac) 或 Ctrl+S(Windows、Linux)保存。 DevTools 将整个 JS 文件修补到 Chrome 的 JavaScript 引擎中。

运行 JavaScript 片段

如果您发现自己在控制台中重复运行相同的代码,请考虑将代码另存为代码段。 片段是您在【Sources】面板中创作的脚本。 它们可以访问页面的 JavaScript 上下文,并且您可以在任何页面上运行它们。 片段是书签的替代品。

console.log('Hello, Snippets!');
document.body.innerHTML = '';
var p = document.createElement('p');
p.textContent = 'Hello, Snippets!';
document.body.appendChild(p);

How the page looks after running the Snippet.

打开片段窗格

    1,用鼠标打开片段窗格。单击【Sources】选项卡以打开【Sources】面板。 【Page】窗格通常默认打开。 单击【Snippets】选项卡以打开【Snippets】窗格。 您可能需要单击【更多选项卡】才能访问代码段选项。

     2,使用命令菜单打开片段窗格。将光标放在 DevTools 内的某个位置。按 Control+Shift+P 或 Command+Shift+P (Mac) 打开命令菜单。开始键入 【Snippets】,选择 【Show Snippets】,然后按 【Enter】 运行命令。

创建片段 

    1,通过【Sources 】面板创建代码段。 打开片段窗格。单击新建代码段。输入代码段的名称,然后按 Enter 保存。

    2,通过命令菜单创建片段。将光标放在 DevTools 内的某个位置。按 Control+Shift+P 或 Command+Shift+P (Mac) 打开命令菜单。开始输入 【Snippet】,选择 【Create new snippet】,然后按 【Enter】 运行命令。

编辑片段

    打开片段窗格。在 【Snippets】 窗格中,单击要编辑的 Snippet 的名称以在代码编辑器中打开它。使用代码编辑器将 JavaScript 添加到您的代码段。如果您的代码段名称旁边有一个星号,则表示您有未保存的代码。 按 Control+S 或 Command+S (Mac) 进行保存。

运行代码段 

    1,从【Sources 】面板运行代码段。 打开片段窗格。单击要运行的代码段的名称。 代码段在代码编辑器中打开。单击运行代码段运行代码段,或按 Control+Enter 或 Command+Enter (Mac)。

    2,使用命令菜单运行代码段。将光标放在 DevTools 内的某个位置。按 Control+O 或 Command+O (Mac) 打开命令菜单。键入【!】字符后跟要运行的代码段的名称。按 Enter 运行代码段。

管理代码片段 

    1,重命名片段。打开片段窗格。右键单击代码段名称并选择重命名。
    2,删除片段。打开片段窗格。右键单击代码段名称并选择删除。

Sources 面板概览 

查看文件 

使用【Page】窗格查看页面已加载的所有资源。

页面窗格的组织方式:顶层, top 代表主文档框架。第二级,代表一个来源。第三级、第四级等代表从该源加载的目录和资源。单击【Page】窗格中的文件以在【Editor 】窗格中查看其内容。 您可以查看任何类型的文件。 对于图像,您会看到图像的预览。

编辑 CSS 和 JavaScript 

使用编辑器窗格来编辑 CSS 和 JavaScript。 DevTools 更新页面以运行您的新代码。 例如,如果您编辑元素的背景颜色,您将看到更改立即生效。

CSS 更改立即生效,无需保存。 要使 JavaScript 更改生效,请按 Command+S (Mac) 或 Control+S(Windows、Linux)。 DevTools 不会重新运行脚本,因此唯一生效的 JavaScript 更改是您在函数内部所做的更改。 例如,在图 4 中,请注意 【console.log('A') 】不运行,而 【console.log('B') 】运行。 如果 DevTools 在进行更改后重新运行整个脚本,那么文本 A 将被记录到控制台。 

创建、保存和运行代码段

片段是可以在任何页面上运行的脚本。 想象一下,您在 Console 中重复输入以下代码,以便将 jQuery 库插入到页面中,以便您可以从 Console 运行 jQuery 命令: 

let script = document.createElement('script');
script.src = 'https://code.jquery.com/jquery-3.2.1.min.js';
script.crossOrigin = 'anonymous';
script.integrity = 'sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=';
document.head.appendChild(script);

相反,您可以将此代码保存在 Snippet 中,并在需要时通过单击几下按钮来运行它。 DevTools 将代码片段保存到您的文件系统。

调试后台服务 

Chrome DevTools 的后台服务部分是 JavaScript API 的工具集合,即使用户没有打开您的网站,您的网站也可以发送和接收更新。 后台服务在功能上类似于后台进程。 Chrome DevTools 将以下每个 API 视为后台服务: 【后台获取 Background Fetch】,【后台同步 Background Sync】,【通知 Notifications】,【推送消息 Push Messages】。即使 DevTools 未打开,Chrome DevTools 也可以记录 3 天的后台服务事件。 这可以帮助您确保事件按预期发送和接收。 您还可以检查每个事件的详细信息。

后台获取

【Background Fetch API】 使 【Service Worker】 能够可靠地下载大型资源,如电影或播客,作为后台服务。 要记录 3 天的后台提取事件,即使 DevTools 未打开: 打开开发者工具。打开【Application】面板。打开【Background Fetch】窗格。单击【Record】。 触发一些后台提取活动后,DevTools 将事件记录到表中。单击一个事件可在表格下方的空间中查看其详细信息。

后台同步 

【Background Sync API】 使离线 【Service Worker】能够在重新建立可靠的互联网连接后将数据发送到服务器。 要记录 3 天的后台同步事件,即使 DevTools 未打开: 打开开发者工具。打开【Application】面板。打开【Background Sync】窗格。单击【Record】。 触发一些后台同步活动后,DevTools 将事件记录到表中。单击一个事件可在表格下方的空间中查看其详细信息。

通知  

【Service Worker】从服务器收到推送消息后,【Service Worker】 使用 【Notifications API】 向用户显示数据。 要记录 3 天的通知,即使 DevTools 未打开: 打开开发者工具。打开【Application】面板。打开【Notifications】窗格。单击【Record】。 触发一些通知活动后,DevTools 将事件记录到表中。单击一个事件可在表格下方的空间中查看其详细信息。

推送消息 

要向用户显示推送通知,【Service Worker】必须首先使用推送消息 API 从服务器接收数据。 当 【Service Worker】 准备好显示通知时,它会使用 【Notifications API】。 要记录推送消息 3 天,即使 DevTools 未打开: 打开开发者工具。打开【Application】面板。打开【Push Messaging】窗格。单击【Record】。 触发一些推送消息活动后,DevTools 将事件记录到表中。单击一个事件可在表格下方的空间中查看其详细信息。

忽略 Chrome 扩展脚本 

当使用 Chrome DevTools 的 Sources 面板单步执行代码时,有时您会在不认识的代码上暂停。 您可能暂停了已安装的其中一个 Chrome 扩展程序的代码。 永远不要暂停扩展代码:按 F1 打开设置。 或单击【Settings】。打开忽略列表选项卡。启用【Add content scripts to ignore list】复选框。

禁用 JavaScript 

要查看禁用 JavaScript 时网页的外观和行为:打开 Chrome 开发者工具。按 Control+Shift+P 或 Command+Shift+P (Mac) 打开命令菜单。开始键入【javascript】,选择【Disable JavaScript】,然后按 Enter 运行命令。 JavaScript 现在已禁用。Sources 旁边的黄色警告图标提醒您 JavaScript 已禁用。只要您打开 DevTools,JavaScript 在此选项卡中将保持禁用状态。您可能希望重新加载页面以查看页面在加载时是否以及如何依赖 JavaScript。要重新启用 JavaScript:再次打开命令菜单并运行【Enable JavaScript】命令。

【高手切磋】Chrome DevTools 详述 是 Google Chrome 浏览器内置的一套强大的开发者工具,用于调试和优化网页。它提供了丰富的功能,帮助开发者检查和修改 HTML、CSS 和 JavaScript 代码,分析性能问题,调试网络请求,以及进行其他各种开发任务。 阅读详情

相关推荐

Chrome DevTools Protocol 入门:相关概念

在上篇文章中,我们快速地使用了 Chrome DevTools Protocol(CDP)发送指令,成功实现了一些浏览器自动化操作。然而,要想深入使用 CDP,还需要对其中的协议概念有更深入的理解。这些概念不仅是我们与浏览器交互的基础,还决定了我们如何构建更复杂、更灵活的调试和自动化操作。为了让这些概念更容易理解,我们将在这里通过实例化的方式,打一些比方,让抽象的概念变得更加具象化。通过这些实例化的比喻和解释,我们可以更直观地理解 Chrome DevTools Protocol 中的域方法事件和类型。

守城小轩的技术窝棚 2178

Chrome 开发者工具 第十四章(控制台实时观察 JavaScript)

Chrome 开发者工具的控制台提供了一个非常实用的功能——实时表达式。这个功能允许开发者在控制台顶部固定一个或多个JavaScript表达式,以便实时跟踪它们的值。这对于监测变量或表达式的变化特别有用,尤其是当你发现自己需要反复输入同一个表达式来查看其值时。

帮助别人就是帮助自己 1495

Chrome DevTools调试技巧:提升编程学习效率

Chrome DevTools是一个功能强大的开发者工具,提供了许多有用的功能,可以帮助您更轻松地调试和优化代码。通过充分利用这些调试技巧,您可以提高编程学习的效率,并更好地理解和优化您的代码。例如,您可以在Application面板中查看和修改网页的Cookie,检查本地存储的数据,并模拟离线状态以测试网页的响应。通过录制和分析网页的性能数据,您可以识别出慢速函数、内存泄漏、不必要的重绘等问题,并采取相应的措施来改进代码性能。在设置断点后,可以逐步执行代码,并使用Watch面板查看变量的值。

IELLQUI8的博客 188

chrome debug某个变量的属性变化 方法

chrome debug某个变量的属性变化 方法 debug window的Kar98k变化 Object.defineProperty(window, 'Kar98k', { get: function() { //取值的时候会触发 console.log('get: ', Kar98k); return Kar98k; }, set: function(value) { //更新值的时候会触发 Kar98k = value;

weixin_43972720的博客 1271

自动驾驶传感器选型实战:摄像头、激光雷达与毫米波雷达融合策略

自动驾驶感知系统的核心在于多传感器协同,而非单一技术优劣。摄像头擅长语义识别但受光照和天气制约;激光雷达提供高精度测距却面临成本、温漂与多径干扰等物理瓶颈;毫米波雷达则以全天候鲁棒性与精准测速成为安全底线的守门人。三者融合不是简单叠加,而是基于场景约束(如暴雨、强光、高速跟车)、成本边界(BOM控制)与时间窗口(量产节奏)的工程权衡。真实量产方案中,‘纯视觉’实为视觉主责+毫米波兜底,‘激光雷达上车’本质是用硬件真值加速算法迭代,而传统车企更倾向以毫米波为仲裁者协调冲突。理解这些底层原理,才能在传感器选型、

weixin_32495691的博客 276

触摸开关原理图_反激式开关电源PCB设计要点

由于最近工作中经常用到反激开关电源,就顺便做个有关反激电源PCB Layout方面的简单总结。关于变压器和补偿环路的设计原理和方法,可以参考之前的文章,链接如下:电子小白菜:反激电源变压器设计篇之详细设计步骤​zhuanlan.zhihu.com电子小白菜:反激电源变压器设计篇之基础原理​zhuanlan.zhihu.com电子小白菜:【干货分享】开关电源环路补偿设计步骤讲解​zhuanlan.z...

weixin_39574868的博客 1157

在 Chrome DevTools 中调试 JavaScript

介绍几种常用的Chrome DevTools断点调试方法1. 代码行断点 2. DOM更新断点 4. XHR/Fetch断点 5. 事件侦听器断点 6. 异常断点 7. 函数断点

从入门到进错门 1万+

USRP N210与MATLAB连接实战:从驱动安装到信号接收

本文详细介绍了USRP N210与MATLAB连接的完整流程,涵盖驱动安装、网络配置、支持包安装及信号接收实战。重点解决了安装过程中的常见错误和硬件连接问题,并通过MATLAB代码示例展示了如何配置接收器、处理信号数据,帮助用户快速实现从设备对接到信号分析的全过程。

blue的专栏 818

Chrome Devtools 高级调试指南

From (Chrome Devtools 高级调试指南 ):https://juejin.cn/post/6844903961472974855 chrome devtools 设置黑色主题:https://blog.youkuaiyun.com/sinat_15347975/article/details/81151342 Chrome DevTools ...

墨鱼菜鸡 3890

【windows】【系统还原】亦是美kms执行一键关闭defender 之后,windows defender 被卸载了,无论如何都打不开

还是执行 都没有明显效果 那么,我最后是怎么解决得呢? 一、打开控制面板(任务栏搜索kzmb)

weixin_41899098的博客 6903

腾讯Octop:Windows本地AI助手一键安装实战指南

本地AI助手是面向普通用户在个人设备上运行大语言模型的轻量级解决方案,其核心原理在于封装模型加载、推理调度与Web交互等底层复杂性,通过预编译运行时、自适应硬件加速和图形化配置降低使用门槛。技术价值体现在免环境依赖、离线可用、开箱即用,显著提升非开发者在专利撰写、文案生成、技术文档处理等办公场景中的生产力。本文聚焦Windows平台下的腾讯Octop工具,结合qwen2-7b-instruct、phi-3-mini等主流GGUF量化模型,详解安装适配、API集成与专利辅助工作流,覆盖从零部署到工程落地的完整

weixin_29055137的博客 304

Chrome DevTools MCP

MCP代表——一种新的通信层,旨在帮助工具(甚至AI代理)与软件进行结构化交互。当Chrome添加MCP支持时,它实际上给了DevTools一个大脑和声音。“打开这个页面。“等待登录按钮出现。“截取屏幕截图。“开始性能 trace。“告诉我出现了什么控制台错误。简而言之,Chrome DevTools MCP将你的浏览器变成了一个API驱动的自动化伙伴——不再只是一个你手动检查的地方。

新缸中之脑 788

PLSQL Developer14连接Oracle详细过程

下载地址:Instant Client for Microsoft Windows (x64) 64-bit | Oracle 中国解压客户端工具到一个目录(解压文件到当前目录,自动合并成一个目录)​ 电脑(右键)→属性→高级系统设置→环境变量→系统环境变量→新建变量名:NLS_LANG 变量值: AMERICAN_AMERICA.ZHS16GBK​ 变量名:TNS_ADMIN 变量值:C:\xiaxinyu\software\Oracle\instantclient_19_10​ 在Oracle客户端(C

summer_fish的专栏 3980

Clojure实现的Chrome DevTools远程控制库——clj-chrome-devtools

Clojure实现的Chrome DevTools远程控制库——clj-chrome-devtools 项目基础介绍 clj-chrome-devtools 是一个Clojure语言编写的开源项目,旨在提供一个通用的库来控制无头Chrome浏览器,使用Chrome DevTools Protocol(CDP)进行通信。这个库能够通过WebSocket连接Clojure和Chrome,从而实现远程控...

gitblog_00169的博客 465

TMS320F28335调试跟踪的问题:DSP从上电复位,一直到执行main()的第一条语句之间,都干了些什么,以及CCS调试时程序查找的问题

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1210

概率的接力:拆解大模型“预测下一个词“的底层逻辑

大模型的智能不在于它拥有了意识,而在于它用纯数学的架构,将人类语言的复杂结构压缩为可计算的向量轨迹与概率接力。当我们不再将其拟人化为"思考者",而是视作高维条件概率引擎时,才能真正驾驭它。预测下一个词,从来不是终点,而是起点。未来的核心竞争力,属于那些能洞察其统计本质、善用其模式生成能力,并以人类理性与事实为锚点的协作者。词元的轨迹终会止步于上下文窗口,但对技术底层的清醒认知,才是跨越幻觉、走向真实智能的基石。

AI浩 328

Codex接入Chrome DevTools MCP教程

MCP(Model Context Protocol)服务操作浏览器获取页面 DOM调试网页分析 Network 请求自动执行 DevTools 操作AI + Chrome DevTools 自动化CodexClaudeCursorClineRooCode很多 AI 工具都开始支持 MCP。1. Codex CLI 没安装2. Windows PATH 没配置基本就能正常运行。对于前端开发来说。帮你写代码自动调试浏览器这一点变化其实非常大。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2808

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Chrome DevTools Protocol 入门:快速开始

Chrome DevTools Protocol 是 Chrome 浏览器提供的一种低级 API,开发者可以通过它与浏览器的内部机制进行交互。它支持浏览器调试、性能分析、DOM 操作、网络管理等多种功能,几乎覆盖了开发者需要的所有调试和自动化场景。通过 WebSocket 与浏览器建立连接,客户端程序可以向浏览器发送命令,并通过监听事件获取浏览器的状态反馈。Page 域:管理页面的加载、导航和截屏。DOM 域:操作 DOM 树结构,获取页面元素的信息。Network 域:拦截和监控网络请求。

守城小轩的技术窝棚 9864

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Chrome DevTools MCP参考指南

Chrome DevTools MCP (Model Context Protocol) Tool 提供了一套完整的浏览器自动化和调试能力,可用于网页测试、自动化操作、性能分析等场景。该工具集包含 26 个功能工具,分为 6 大类别。在Claude Code中也可以调用Chrome DevTools MCP来完成网页内容抓取和分析工作,或者进行一些表单填写和提交。

zsslineage2的博客 1656

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Chrome底层及Chrome-devtools-mcp

概念说明Chrome 应用只有一个,在里Chrome 实例可以启动多个,通过区分MCP 的 Chrome就是用独立数据目录启动的另一个实例所以你电脑上确实只有一个 Chrome,但可以同时运行多个"身份"独立的窗口。问题答案无头浏览器是什么?没有图形界面,在后台运行的浏览器MCP 启动的是无头吗?❌ 默认是有头的(有窗口)能改成无头吗?✅ 可以,加--headless参数什么时候用无头?服务器自动化、CI/CD、不需要看界面时。

EmotionComputer 1389

【MCP工具】Chrome DevTools MCP:把浏览器自动化与 DevTools 调试能力接入 AI Agent

本文围绕 Chrome DevTools MCP 展开技术学习分享,介绍其如何将真实 Chrome 浏览器的自动化操作、Console、Network、Performance、Memory、Lighthouse 等 DevTools 调试能力接入 AI Agent 工作流。文章结合官方工具能力、演示场景、快速上手配置,并对比 Playwright MCP 的定位差异,帮助开发者理解它在前端调试、页面验证、性能分析和 AI Coding Agent 闭环中的实际价值。

weixin_66397563的博客 945

谷歌官方 Chrome DevTools MCP 正式发布

Google推出Chrome DevTools MCP服务器,让AI开发工具可直接调试网页。该功能解决了AI无法实时查看网页运行状态的痛点,支持集成到Claude Code、Cursor等主流开发工具中。安装需Node.js 22.12.0以上版本,通过简单配置即可实现网页调试、性能分析、错误诊断等功能。开发者现可让AI代理实时验证代码、分析网络请求、模拟用户行为,并自动执行性能审核。这一创新将显著提升AI辅助开发的效率和准确性。

智造编程 2903

Chrome DevTools MCP使用

Chrome DevTools MCP

HeroRazor的专栏 480

Chrome DevTools MCP 使用指南

是Anthropic提出的一个开放协议,用于连接大型语言模型(LLM)与外部工具和数据源。提升开发效率:AI可以自动执行繁琐的测试任务改善代码质量:AI可以实时分析性能,提供优化建议简化测试流程:自动化测试变得简单易用增强AI能力:AI从代码生成扩展到实际测试和调试。

郑板桥30的博客 4586
上一篇: Chrome DevTools
java_hzh
博客等级 码龄11年 2粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值