Обновить
32K+

Отладка *

Поиск и устранение ошибок в коде

19,9
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Профилирование сборки проекта

Время на прочтение4 мин
Охват и читатели5.6K
Пару месяцев назад я прикрутил профилирование к нашей билд-системе (форке JamPlus). Оно было реализовано на уже описанном мной ранее Chrome Tracing View, так что добавить его поддержку в Jam было просто. Jam написан на С, так что я просто нашел подходящую библиотеку для профилирования на С (это была minitrace) и буквально несколькими строками обернул интересующие меня места (собственно, сборку).

image

Здесь нет ничего выдающегося. Однако… как только у вас появляются первые результаты профилирования, они чаще всего заставляют задуматься и начать кое-что замечать.
Читать дальше →

Как я написал свою CMS, и почему не рекомендую вам делать то же самое

Время на прочтение7 мин
Охват и читатели43K
Работа над программами управления контентом CMS (content management system) полна чудес. Под катом поучительная история Petr Palas. Если у вас все хорошо с английским, то в оригинале текст можно почитать здесь. Enjoy!
Читать дальше →

Использование фронтенда профилировщика Chrome в собственных проектах

Время на прочтение3 мин
Охват и читатели10K
Возможно, вы знаете, что у браузере Google Chrome есть встроенный профилировщик. Но даже из тех людей, кто его видел, большинство считает, что использовать его можно только для отладки Javascript или отрисовки кадров в браузере. Но на самом деле его весьма просто можно прикрутить в качестве средства визуализации данных профилирования в вашем проекте.

Я не открою здесь каких-то уникальных секретов, например, Colt McAnlis писал о подобном применении профилировщика Chrome в игровых проектах ещё в 2012 году. Всё, написанное там, всё ещё является правдой, а я напишу ещё один материал — просто для лучшего распространения знаний о столь полезном инструменте.

Предыстория


Для некоторой части нашей системы сборки кода мы когда-то написали простенький профилировщик (называется TinyProfiler). Он достаточно тривиален — замеряет время выполнения определенных блоков кода и создаёт набор HTML+SVG файлов, которые визуализируют эти данные в стиле flame-графов:

image

Это, в принципе, неплохо работало, но полученный HTML был не очень интерактивным. Можно было подвести мышку к определенному блоку и увидеть его название во всплывающей подсказке, но на этом все удобства и заканчивались. Не было ни зума, ни фильтрации, ни скрола, ни поиска — в общем ничего, чего хотелось бы получить от более-менее профессионального инструмента. Всё это можно было, конечно, сесть и написать, но… зачем же это делать, если можно этого не делать? Ведь уже есть кто-то (разработчики Chrome), кто всё это уже сделал.
Читать дальше →

Тавтологические тесты

Время на прочтение7 мин
Охват и читатели20K


Привет! Меня зовут Артём, и большую часть своего рабочего времени я пишу сложные автотесты на Selenium и Cucumber/Calabash. Честно говоря, довольно часто я оказываюсь перед непростым выбором: написать тест, который проверяет конкретную реализацию функциональности (потому что это проще) или тест, который проверяет функциональность (потому что это правильнее, но намного сложнее)? Недавно мне попалась неплохая статья о том, что тесты реализации – это «тавтологические» тесты. И, прочитав её, я уже почти неделю переписываю некоторые тесты в другом ключе. Надеюсь, вас она тоже подтолкнёт к размышлениям.

Читать дальше →

Почему нельзя полагаться на пользовательские отчёты об ошибках

Время на прочтение5 мин
Охват и читатели8.8K


Мы в Parallels достаточно внимательно анализируем пользовательские отчёты об ошибках. У нас на этот счет внедрена автоматизированная система учета и обработки данных. Специально обученные люди работают с информацией и лечат болячки у пользователей. Однако, не все разделяют нашу философию. Под катом интересное мнение Ника Харли на портале Medium. В комментариях можно отлично подискутировать на заданную тему.
Читать дальше →

Пакет Network Security Services и утилита Pretty-print

Время на прочтение3 мин
Охват и читатели7.1K
Пакет Network Security Services (NSS) представляет собой набор библиотек, используемых при кроссплатформенной разработке защищенных клиентских и серверных приложений.
Читать дальше →

Пять инструментов отладки JavaScript, о которых полезно знать

Время на прочтение5 мин
Охват и читатели28K
Вы смотрите на код и не можете понять — почему! Почему он делает нечто неожиданное, и в общем-то, если не близится дедлайн, интересное. Однако от всех этих неожиданностей, в любом случае, надо избавляться.



Прежде чем вы, бросив всё остальное, кинетесь складывать в кучу найденные где-то строчки программ, которые, вроде бы, способны решить вашу задачу, ответьте пожалуйста на три вопроса:

  1. Выполнение каких действий вы ожидаете от своей программы?
  2. Почему вы ожидаете этого от программы?
  3. Делает ли программа то, что вы от неё ожидаете?

Если вы не можете ответить на первых два вопроса — желаю удачи в копипасте, но, если вы знаете — что вы ожидаете от кода и почему — существуют инструменты, которые способны помочь вам понять, делает ли код то, чего от него ждут.
Читать дальше →

Эмулятор в эмуляторе для проигрывания чиптюн-мелодий на YM2149F

Время на прочтение4 мин
Охват и читатели6.8K

Кто помнит Tetris 2 на Спектруме? Там были куча уровней, возможность играть вдвоём и классная музыка.

Недавно мы сделали 8-битный компьютер для несложных игр, но никаких звуковых возможностей в нём не предусмотрели. И вот захотелось добавить туда какую-нибудь 8-битную музыку. Мне вспомнилась именно мелодия из Tetris 2 (много за ним часов проведено), поэтому я стал с ней ковыряться.

Процессор ATmega328P в нашем компьютере большую часть времени занят отрисовкой изображения, поэтому времени на синтезирование нормальной музыки совсем нет. Значит нам понадобится звуковой процессор YM2149F (он же AY-3-8910), такой же как в ZX Spectrum и других компьютерах.

Немного про «ашипки» в программном обеспечении и помощь теории конечного автомата

Время на прочтение6 мин
Охват и читатели5.2K

Работая в сфере ИТ, волей-неволей замечаешь огромное количество ошибок в различном программном обеспечении. Будь то ошибки мировых вендоров Microsoft, или же в прикладных бизнес-решениях фирмы 1С, или же в хваленных Apple с детской фатальной ошибкой "1 января 1970". Что уж говорить про небольшие компании с небольшим штатом программистов?


Насколько ошибки в ПО являются естественным процессом? Давайте разберёмся. Всё ниже является исключительно авторским мнением, в том числе классификация, возможность применения теории конечного автомата, наблюдения. 


Читать дальше →

Разворачиваем Emercoin testnet и получаем много бесплатных монет

Время на прочтение3 мин
Охват и читатели10K


Допустим, вы решили создать проект активно использующий блокчейн. Для хранения данных о товарах и их производителях, для учета транспортных средств и т.п. Будет разумно проверить работу всех узлов на всех стадиях и не по одному разу. Встает проблема: записи в блокчейне не бесплатны, а если тестов много, то это может влететь в копеечку.

Специально для таких случаев существует режим “test mode”, когда монеты можно добывать центральным процессором любого маломощного ПК, но при этом они обладают всеми немонетарными свойствами “больших” монет EMC. Тестовые монеты можно пересылать на тестовые же адреса, создавать сколько угодно блокчейн-записей NVS, а кошельки в этом режиме объединять в testnet.

Сделать это очень просто:

Для начала надо скачать и установить последний кошелек Emercoin. Затем открыть emercoin.conf* и прописать:

testnet=1

Запустить кошелек и немного подождать. Клиент найдет тестовый сервер-сид и синхронизирует в течении минут блокчейн. Если клиент долго не может найти сида, заходим в консоль и указываем сид мануально:



addnode 188.166.12.157 add

Читать дальше →

Скрытые послания в именах свойств JavaScript

Время на прочтение6 мин
Охват и читатели26K
Для тестирования код нужно выделить и скопировать прямо из твита. — прим. пер.

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

Вот тот сниппет:



Что бы вы ожидали от него?

Здесь используется цикл for in, который проходит через перечислимые свойства объекта. Поскольку указано только свойство A, можно предположить, что будет показано сообщение с буквой А. Ну… я ошибался. :D
Читать дальше →

37 причин, почему ваша нейросеть не работает

Время на прочтение9 мин
Охват и читатели47K
Сеть обучалась последние 12 часов. Всё выглядело хорошо: градиенты стабильные, функция потерь уменьшалась. Но потом пришёл результат: все нули, один фон, ничего не распознано. «Что я сделал не так?», — спросил я у компьютера, который промолчал в ответ.

Почему нейросеть выдаёт мусор (например, среднее всех результатов или у неё реально слабая точность)? С чего начать проверку?

Сеть может не обучаться по ряду причин. По итогу многих отладочных сессий я заметил, что часто делаю одни и те же проверки. Здесь я собрал в удобный список свой опыт вместе с лучшими идеями коллег. Надеюсь, этот список будет полезен и вам.
Читать дальше →

SwiftyBeaver руководство для iOS: платформа логирования для Swift

Время на прочтение12 мин
Охват и читатели6.1K
Ошибки бывают разных форм и размеров. Некоторые ошибки милые и пушистые и их легко исправить, потому что вы можете запустить ваше приложение и пойти прямо к тому месту где происходит ошибка. Если вы счастливчик, Xcode покажет вам какая строка привела к падению вашего приложения.

Другие ошибки более зловещие. Они таятся в фоне и случаются когда вы менее всего этого ожидаете. Они ужасы ночных кошмаров и рекламных роликов Listerine.

В этом уроке вы обнаружите секретное оружие, с которым сможете разобраться с этим зловещими ошибками, которые притаились в фоне. При должном использовании это оружие похоже на свет фонарика в самых глубоких и темных расщелинах вашего приложения. У этих жутких ошибок не будет ни единого шанса.

Это оружие — SwiftyBeaver, основанная на Swift система логирования для iOS и macOS.

В этом руководстве вы узнаете как отлаживать ваше приложения используя SwiftyBeaver и получите следующие полезные умения на этом пути:

  • Когда SwiftyBeaver логирование лучше чем print() и NSLog()
  • Как получить доступ к журналам SwiftyBeaver в Crypto Cloud
  • Как использовать уровни логирования для различных типов сообщений журнала
  • Как фильтровать записи, чтобы облегчить поиск ошибок
Читать дальше →

Ближайшие события

Как я проник на сервер PayPal через баг в загрузке файлов и получил доступ к удаленному выполнению кода

Время на прочтение4 мин
Охват и читатели26K
Пентестер (тестировщик на проникновение) рассказывает, как ему удалось найти баг в загрузке файлов и проникнуть на сервер платежной системы PayPal.

image

Привет всем!

Надеюсь, у вас все хорошо. Уверен, что заголовок вас немало удивил, и вы ринулись сюда чтобы глянуть, реально ли я cмог получить удаленный доступ не куда-нибудь, а на сервер PayPal.

На самом деле это был довольно простенький взлом, направленный на проверку уязвимости (так называемый POC). Единственный момент, с которым мне повезло — поиск и успешное определение уязвимого домена.
Читать дальше →

Разбираемся с копированием и клонированием

Время на прочтение2 мин
Охват и читатели14K


Я наткнулся на статью Нареша Джоши о копировании и клонировании и был удивлён ситуацией с производительностью. У клонирования есть проблемы с финальными полями. А учитывая тот факт, что интерфейс Cloneable не предоставляет метод clone, то для вызова clone вам необходимо будет знать конкретный тип класса.

Читать дальше →

Еще один breakpad сервер. Часть 1

Время на прочтение6 мин
Охват и читатели5.1K

В прошлом квартале делали MVP сервиса по обработке крешей. Аналог Socorro от Mozilla, но с учетом своих требований. Код сервиса будет выкладываться на GitHub по мере рефакторинга. Утилиты, о которых пойдет речь в этой статье, доступны тут.


У нас были следующие требования:


  • получение отчета с Windows, Mac OS X, GNU/Linux;
  • получение отчета о падения с веба(собираем через emscripten);
  • сбор данных об оборудовании(CPU, GPU, Memory);
  • группировка падений по версии, платформе, пользователю, причине;
  • приложение ведет логи, нужно вместе с отчетом хранить и лог.

Содержание:


  • Breakpad: файлы символов и отчеты о падениях;
  • Emscripten: параметры компиляции, файлы символов, обработка ошибок;
  • UI.
Читать дальше →

Как мы искали и нашли ошибку в Visual Studio C++

Время на прочтение5 мин
Охват и читатели24K
Это был чудесный летний день. За окном сияли тучки, нежными голосами пели вороны, на автомойке весело пачкали шампунем чью-то машину, за стеной тихо скрёбся перфоратор — в общем, идиллия.

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

Предыстория


Компания у нас существует относительно давно, и основной продукт уже старше некоторых сотрудников компании, так что древнего кода хватает. Тем не менее, мы стараемся держаться в современном русле, Modern C++ активно используется, поэтому около года назад основной проект был переведён на VC2015. Это был отдельный цирк с конями, бубнами, блэкджеком и валерьянкой. Вспомогательный код переводится по мере того, как появляется время и желание. В данном случае, я решил перевести на VC2015 один из таких вспомогательных проектов, который очень активно используется нашей техподдержкой.

Я был уверен, что уже знаю подводные камни такого перехода, и что задача займёт не более часа работы.
Читать дальше →

Инструменты для разработчика Go: знакомимся с лейблами профайлера

Время на прочтение4 мин
Охват и читатели15K

DrawingПривет. Меня зовут Марко. Я системный программист в Badoo. Представляю вашему вниманию перевод поста замечательной rakyll о новой фиче в Go 1.9. Мне кажется, что лейблы будут очень полезны для профилирования ваших Go-программ. Мы в Badoo, например, используем аналогичную штуку для того, чтобы тегировать куски кода в наших программах на С. И если срабатывает таймер и в лог выводится стек-трейс, то в дополнение к нему мы выводим такой вот тег. В нем, например, может быть сказано, что мы обрабатывали фотографии пользователя с определенным UID. Это невероятно полезно, и я очень рад, что похожая возможность появилась и в Go.

Читать дальше →

Как я нашёл баг в процессорах Intel Skylake

Время на прочтение9 мин
Охват и читатели47K
Инструкторы курсов «Введение в программирование» знают, что студенты находят любые причины для ошибок своих программ. Процедура сортировки отбраковала половину данных? «Это может быть вирус в Windows!» Двоичный поиск ни разу не сработал? «Компилятор Java сегодня странно себя ведёт!» Опытные программисты очень хорошо знают, что баг обычно в их собственном коде, иногда в сторонних библиотеках, очень редко в системных библиотеках, крайне редко в компиляторе и никогда — в процессоре. Я тоже так думал до недавнего времени. Пока не столкнулся с багом в процессорах Intel Skylake, когда занимался отладкой таинственных сбоев OCaml.

Первое проявление


В конце апреля 2016 года вскоре после выпуска OCaml 4.03.0 один Очень Серьёзный Индустриальный Пользователь OCaml (ОСИП) обратился ко мне в частном порядке с плохими новостями: одно из наших приложений, написанное на OCaml и скомпилированное в OCaml 4.03.0, падало случайным образом. Не при каждом запуске, но иногда вылетал segfault, в разных местах кода. Более того, сбои наблюдались только на их самых новых компьютерах, которые работали на процессорах Intel Skylake (Skylake — это кодовое название последнего на тот момент поколения процессоров Intel. Сейчас последним поколением является Kaby Lake).

За последние 25 лет мне сообщали о многих багах OCaml, но это сообщение вызывало особенное беспокойство. Почему только процессоры Skylake? В конце концов, я даже не мог воспроизвести сбои в бинарниках ОСИПа на компьютерах в моей компании Inria, потому что все они работали на более старых процессорах Intel. Почему сбои не воспроизводятся? Однопоточное приложение ОСИПа делает сетевые и дисковые операции I/O, так что его выполнение должно быть строго детерминировано, и любой баг, который вызвал segfault, должен проявлять себя при каждом запуске в том же месте кода.
Читать дальше →

Используем template + constexpr для создания масок регистров периферии микроконтроллера на этапе компиляции (C++14)

Время на прочтение15 мин
Охват и читатели11K

Введение


Эта небольшая заметка содержит не очевидное решение поставленной ниже задачи, до которого мне пришлось доходить несколько бессонных ночей.

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



Заинтересовавшихся в том, как это можно сделать, прошу под кат.
Читать дальше →