@0xd34df00d

Тег programming в блоге 0xd34df00d

0xd34df00d

Заебало, что .so'шки с плюгинами для личкрафтов большие, так что наваял по-быстренькому на х-ле программу, чтобы считать размер секций и отдельных функций (если дебаг-символы не пострипаны). Работает как-то так:

*Main Lib> (syms, sects) <- doStuff "/usr/local/lib/leechcraft/plugins-qt5/libleechcraft_azoth.so"

*Main Lib> take 10 syms
[(Just "_ZL16qt_resource_data",65105),(Just "_ZN10LeechCraft5Azoth14ActionsManager21CreateActionsForEntryEPNS0_8ICLEntryE",25892),(Just "_ZN17Ui_LocationDialog7setupUiEP7QDialog",18613),(Just "_ZN10LeechCraft5Azoth14ActionsManager14ActionsVectorsC2EPNS0_14AvatarsManagerE",8967),(Just "_ZN10LeechCraft5Azoth10MainWidgetC1EPNS0_21AccountActionsManagerEP7QWidget",8191),(Just "_ZN10LeechCraft5Azoth10MainWidgetC2EPNS0_21AccountActionsManagerEP7QWidget",8191),(Just "_ZN10LeechCraft5Azoth16CLTooltipManager17MakeTooltipStringEPNS0_8ICLEntryE7QString",8073),(Just "_ZN10LeechCraft5Azoth13PluginManager18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv",7739),(Just "_ZN10LeechCraft5Azoth21AccountActionsManagerC1EP7QObject",7519),(Just "_ZN10LeechCraft5Azoth21AccountActionsManagerC2EP7QObject",7519)]

*Main Lib> filter (not . ("debug" `isInfixOf`) . fst) $ sortBy (flip $ comparing snd) $ S.toList sects
[(".text",2129308),(".strtab",1657302),(".symtab",565968),(".eh_frame",432672),(".gcc_except_table",314740),(".rodata",284286),(".rela.dyn",140664),(".dynstr",135737),(".eh_frame_hdr",120420),(".dynsym",66000),(".rela.plt",52704),(".data.rel.ro",50400),(".plt",35152),(".got.plt",17592),(".gnu.hash",10040),(".bss",6192),(".gnu.version",5500),(".dynamic",912),(".got",688),(".gnu.version_r",464),(".shstrtab",397),(".data",248),(".init_array",248),(".qtmetadata",184),(".comment",52),(".plt.got",48),(".init",23),(".qtversion",16),(".fini",9),(".fini_array",8),("",0)]

Надо прикрутить деманглер и всякое такое, но смысл понятен. Можно, наверное, дальше с этим всем что-то делать.

Что бы ещё можно было прикрутить, что интересного можно показывать?

#mbdwi
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Как docker сообщает об опечатке в имени опции, передаваемой демону при старте?

Mar  5 07:25:43 build2 /etc/init.d/docker[6349]: You have to create an init script for each container:
Mar  5 07:25:43 build2 /etc/init.d/docker[6350]:  ln -s lxc /etc/init.d/lxc.container
Mar  5 07:25:43 build2 /etc/init.d/docker[6279]: ERROR: docker failed to stop

Наверное, кто-то в if (err != nil) return err; опечатался.

#miuaj
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Надо запилить тег «goвно».

#miswq 2
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d


Почему-то проиграл.

#miucb 6
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Я думал, что видел все, но сегодня я увидел передачу пятка даблов в функцию через их запихивание в ostringstream через пробелы, передачу строки в функцию и парсинг этой строки прямо тама в функции. В performance-critical-коде. Во вложенном цикле.

#mxvat
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Дошли руки посмотреть

.

Блядь, ну и мудак, слов нет. Никогда не пойду в гейдев.

#miuyk 2
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

А как сделать так, чтобы docker build не поддерживал цвета? А то на терминале-то всё красиво:

, а вот jenkins'у сносит башню, когда он пытается распарсить ворнинги компилятора.

#ozann 3
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Перешёл на oral для не совсем тривиальной БД: https://github.com/0xd34df0...a02ebd65a?diff=split

Збс кода уменьшилось!

#owknl 2
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Если кто еще не видел, вот хороший разбор уязвимости с рутом в эпплоговне: https://objective-see.com/blog/blog_0x24.html . С дизасмом и дебаггером, все как надо. tl;dr: в эппле работают криворукие макаки, а return codes для сообщений об ошибках снова соснули.

Впрочем, нахрена вообще какая-то защита для ОС, предназначенной исключительно для понтов и котиков?

#owmjt 9
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Починил весьма существенную причину роста потребления памяти. В каком-то смысле благодаря другому багу (inb4 баг на баге и багом погоняет).

Началось всё с того, что несколько дней назад я заметил, что в одной сервисной либе, отвечающей за загрузку ресурсных файлов, я иногда закрываю файл, только чтобы его открыть позже. Не проблема, исправили: https://github.com/0xd34df0...c6cb1020d561fa0f9375

Перезапустил личкрафты и заметил, что половина иконок проеблась, они 100% процессора жрать стали, и при этом потребление памяти растёт как не в себя. Ну, надо дебажить.

Подебажил первую проблему — оказалось, что в результате предыдущего изменения файл-то уже вычитанный, и если раньше я его переоткрывал, и позиция чтения оказывалась в самом начале, то теперь она в конце, и пользователи этого класса получают пустой массив байт вместо содержимого файла. Не проблема, исправили: https://github.com/0xd34df0...a9a996c1548faf5a4af7 . После этого заодно и процессор жраться перестал, и память больше не растёт. Казалось бы, хорошо, но пока не очень понятно, почему. Временно ревертим фикс, убеждаемся, что потребление ресурсов воспроизводится, дебажим дальше.

Почему жрался процессор? Это оказалось просто: кусок кода, отвечающий за отрисовку аватарок в IM-клиенте, не ожидал получать пустую картинку в качестве default-аватарки, поэтому запрашивал её ещё раз вот в этой функции: https://github.com/0xd34df0.../core.cpp?ts=4#L1352 , снова получая пустую картинку, снова её запрашивая, и так далее. В принципе, ожидаемое поведение и, пожалуй, даже не баг — хули делать-то, если дефолтовой аватарки нет, что-то сильно не в порядке. Хорошо, закрыли вопрос.

Но почему жралась память? Этого-то быть точно не должно. Других вариантов кроме лажи в Sequence(), отвечающей за этакий псевдомонадический интерфейс для future'ов, нет. Ну, давайте пристально на реализацию смотреть. Смотрим, смотрим, находим одно потенциально проблемное место: вспомогательный объект не всегда подыхает, в частности, если последняя функция в цепочке вызовов возвращает не void. Исправили: https://github.com/0xd34df0...cf7ec9f44bbdc4cf10f3 . Но от этого не легче, память всё равно растёт! Смотрим дальше, где мы ещё можем забывать удалять объекты.

Смотрел я на это энное время, даже наваял несколько тестов, добавил для них дебаговый вывод в конструкторы-деструкторы, прогнал под valgrind'ом, но везде всё когда надо удалялось. Значит, наверное, проблема не в реализации Sequence. Когда ещё соответствующие объекты могут не удаляться? Например, если future всё никак не станет ready, тогда объект с реализацией монадического интерфейса будет всё это время жить, а других вариантов толком и нет.

Окей, посмотрим, как работает XMPP-модуль в месте получения аватарок ( https://github.com/0xd34df0...rybase.cpp?ts=4#L442 ). И тут прям сходу две проблемы:
1. Раз: если мы в оффлайне, то аватарку мы, понятное дело, не получим никогда. Фикс: в этом случае всегда возвращаем пустую картинку. https://github.com/0xd34df0...c61fe2dbe9922671d9f9
2. Два: по каким-то причинам запрос VCard'а с аватаркой может зафейлиться. Клиент нахуй послал, сервер нахуй послал, контакт удалён с сервера, да мало ли. По-хорошему, надо поменять интерфейс этого FetchVCard на что-то более адекватное, но он делался в до-future-вые времена, поэтому оставим такой рефакторинг на потом, а сейчас пока накостыляем отменяющий таймер: https://github.com/0xd34df0...8f323cbdeaf6bf4984e1

Всё. Потребление памяти не растёт. 730 мегов на старте в воскресенье, 930 мегов сейчас, учитывая, что пооткрывал всяких вкладок в браузере и так далее, и учитывая, что hunspell подтекает примерно на 20 мегов в сутки.

#ozmcn 2
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Заебись с фьючерами: https://github.com/0xd34df0...ac56dde4796de10a499f

#okuvj
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Увы, опыт последних нескольких вопросов показывает, что stackoverflow полезнее иркоканала по плюсам.

#okupi 3
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Прогнал свежий ПиВаС-Студио по личкрафтам. Посмотрим, что оно там сможет такого найти, чего не смог найти коверити.

#ozpar 2
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Не понял, зачем нужны синглтоны.

#owtty 14
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

А что там было про то, что эджайл --- это про дух, а не про карго-культ из скрамов и стендапов.

#owizz 1
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Зашкварился:

>>> Emerging (1 of 5) dev-lang/go-1.9::gentoo
>>> Installing (1 of 5) dev-lang/go-1.9::gentoo
>>> Recording dev-lang/go in "world" favorites file...
#oztme 7
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Шел в сортир, пришла в голову одна идея, вернулся, поменял три строки, и скомпилированные моим конпелятором программы стали вдвое быстрее. Збс.

#ozioo 5
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Чят, я тут пилю веб-сервис, которому на вход можно скормить скачанный с сервиса документ и идентификатор сервиса, а он в ответ его распарсит и что-то там выплюнет. Вопрос: как организовать взаимодействие с этим сервисом?

Я пробовал передавать данные как multipart/form-data (отдельно загрузка файла, отдельно поле с именем сервиса), но получается какая-то неудобоваримая хуита. В итоге я решил тупо заливать JSON с полем для ID сервиса и полем для содержимого документа, но это выглядит как-то по-хипстерски.

Как это правильно делать? Чят, научи бекенд-макаку!

#ozemt 8
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

На godbolt.org завезли поддержку других языков, кроме плюсов. Есть даже хаскель. Собственно, возведение числа в квадрат на хаскеле выглядит очень печально: https://godbolt.org/g/ifWRtP

#ozgcy 2
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
0xd34df00d

Вот тебе задачка на ночь, поинтач: как сортировать массив строк, если равенство двух строк s1 и s2 определяется как то, что расстояние Левенштейна для этих двух строк меньше некоторой функции от длин этих строк?

А я спать пойду.

#ozizs 15
Вы можете выбрать до 10 файлов общим размером не более 10 МБ.

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.