Когда отладка js сталкивается с точкой останова цикла (отладчик), что мне делать?

JavaScript

Статья дополнена новым содержанием и более глубоким анализом волны

Для фронтенд-разработки,отладка jsявляется обязательным навыком. Если вы ищете ошибки или хотите понять логику чужого кода, отладка js поможет вам сэкономить время.

Это интерфейс отладки Chrome, который я обычно использую. Причины его выбора заключаются в том, что функции действительно мощные, а во-вторых, новые функции поддерживаются быстрее (особенно версия Google Chrome Canary, которая имеет последние функции новой версии Chrome, которая предназначена для разработчиков и первых пользователей. , что иногда может привести к полному сбою браузера,скачать через поезд, вы можете перейти сюда, чтобы увидеть его функции и особенности)

Цель этой статьинетПоделитесь подобным кодом формата, установите точки останова, просмотрите использование ряда функций инструмента отладки, таких как вызов и переменные, есть много хороших статей об этом в Интернете, эта статья находится в основном анализе работы.отладчик цикловпроблема, как показано ниже:

Иногда, когда мы просматриваем веб-сайты других людей, чтобы понять функцию кода, мы можем установить точки останова с помощью инструмента отладки JavaScript, чтобы предотвратить выполнение кода. Затем проанализируйте ряд полезной информации, такой как среда выполнения, объекты и переменные точки останова, и завершите интерпретацию логики кода.

В JavaScript мы можем напрямую использовать инструкцию отладчика, чтобы сломать код в указанном месте, например 🌰

console.log('you can see me')
debugger
console.log('can you see me?')

Результат на самом деле вполне очевиден: вы видите вывод первой строки, но при переходе ко второй строке код прерывается, а вывод третьей строки вы можете увидеть только в том случае, если продолжите выполнять ее вручную. Это принцип. Многие коды коммерческих продуктов определяют инструкцию отладчика для беспроводной петли.

  • продолжайте прерывать вас, теряя время
  • Постоянно генерируя неперерабатываемые объекты, занимая вашу память и вызывая утечки памяти, браузеру не потребуется много времени, чтобы зависнуть или дажеперегрузить свой процессор, можно не думать об отладке, хорошо иметь возможность закрыть страницу

Вот простой и понятный 🌰

setTimeout(function(){
	while (true) {
		debugger
	}
},100)

Как нам быть в подобной ситуации? Погуглив, я обнаружил, что общее решение:

Деактивировать точку останова, так это решает проблему?

Просто посмотрите на картинку ниже. Так как все брейкпоинты игнорируются, то даже те, которые вы поставили сами (ваши брейкпойнты бессмысленны) будут продолжать выполнять отладчик, создавать объекты, и ваш процессор будет заполнен.Я обнаружил это на практике.Прическа ненадежная. Уноси, следующий!

Еще одна хитрость:Отключить точки остановаКонкретная операция показана на рисунке ниже.

Мы можем проигнорировать это и продолжить работу с другими точками останова, что все еще работает. Но у этого метода на самом деле есть недостатки, такие как создание других сред выполнения и т.д., нет возможности решить проблему, последняя картина этой отвратительной ситуации.

Вот так, могу ли я использовать вышеуказанный метод для ее решения? Да или нет такой статьи, ха-ха, но надо потерпеть ХорошоМы перейдем к делу, как это решить?Посмотрите на стек вызовов, как показано на рисунке

Мы видим, что этот код вызывается по адресу 0x51c762 в player.js, поэтому нам нужно посмотреть, что именно делает 0x51c762 в player.js? Что ж, по этой линии давайте посмотрим на _0x51c7626 и где он называется

Этот код выглядит настолько расстраивающим, что он написан! Не волнуйтесь, проанализируйте волну, причина, по которой отладчик может зацикливаться, должна быть связана с этим setInterval, в этом таймере вызывается функция _0x51c7626, что указывает на то, что отладчик связан с функцией 0x51c7626, затем убейте их и попробуйте. Конкретный метод заключается в том, чтобы скопировать копию player.js и закомментировать следующий код.

_0x51c762();
setInterval(function() {
    _0x51c762()
}, 0xfa0);

Используйте charles (я использую это, вы можете использовать другие инструменты захвата), чтобы перенаправить на файл js, который вы изменили.

Затем при отладке вы обнаружите, что отладчик цикла, который создает новую среду выполнения, исчез? а ха ха ха. На самом деле, способ, которым каждый веб-сайт делает это, может быть разным, но процедура одна и та же. Выше упоминается только метод защиты от отладки, который просто использует инструкцию dubugger.На самом деле существует много других методов, таких как метод разницы во времени.

var timelimit = 50;
var open = false;
var starttime = new Date();
debugger;
if (new Date() - starttime > timelimit) {
    open = true;
   	//此处执行你的反调试逻辑,比如删除操作
    open = false;
}

Как это, как мы собираемся решить это? На самом деле это очень просто, мы можем поставить точку останова, увеличить лимит времени (например, timelimit = 1000000) и легко его обойти. На практике могут быть другие условия оценки.Нам нужно только один раз установить точку останова в false, чтобы гарантировать, что она не войдет в условный оператор отладчика. Надеюсь, это поможет всем

Перепечатка без моего разрешения запрещена.В статье есть пропуски и неточности.Пожалуйста, поправьте меня.