metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2016-07-25 10:18 am

C, магия макросов и отладка

Судя по тому, что я наблюдаю в либах на Си (например, libuv), магия из макросов весьма популярна, в том числе и для реализации разного рода структур данных вроде списков, хэшей (https://troydhanson.github.io/uthash/) и прочего такого.

Вопрос вот в чем - как это нормально отлаживать то? Падает с access violation где-нибудь в кишках макроса на три страницы, отладчик указывает на строку с макросом и единственный способ понять происходящее - медитировать до бесконечности на содержимое переменных, используемых в макросе, потому что кода не видно. Ну или пытаться в уме разложить дизассемблированный код на исходники.
develop7: (dero)

[personal profile] develop7 2016-07-25 07:22 am (UTC)(link)
https://stackoverflow.com/questions/4900870/can-gcc-output-c-code-after-preprocessing не то чтобы прямо решение, но хоть что-то

[identity profile] sbj-ss.livejournal.com 2016-07-25 07:23 am (UTC)(link)
Я лично таких либ стараюсь избегать. В той же libxml2 есть человеческая реализация хэшей через функции.
Да и сам не размазываю макросы больше, чем на 3-4 строчки тривиального кода.

[identity profile] metaclass.livejournal.com 2016-07-25 07:30 am (UTC)(link)
Да, вероятно, надо без особой нужды в макросы и интрузивные структуры данных не лезть.
Похоже, у меня тут баг из-за того, что я структуру добавляю в один хэш, не выкинув из другого, что выносит мозги интрузивному хэшу просто напрочь.

[identity profile] worm-ii.livejournal.com 2016-07-25 07:43 am (UTC)(link)
Дедовским методам — дедовскую отладку.
Всунуть в макросы отладочную печать.

[identity profile] aamonster.livejournal.com 2016-07-25 08:17 am (UTC)(link)
Убивать, пока они маленькие.

А для совсем ада можно развернуть, отладить и попытаться свернуть обратно... В xcode на маке есть соответствующее представление (companion editor/preprocessed file) - но не помню, как при этом ходит по шагам (показывает ли позицию там).

[identity profile] http://users.livejournal.com/_slw/ 2016-07-25 08:46 am (UTC)(link)
а что, addr2line не спасает?

[identity profile] psilogic.livejournal.com 2016-07-25 08:48 am (UTC)(link)
если операционка и среда человеческие, то процесс отладки выглядит так:
http://hipics.ru/images/2016/07/25/Image43bcbe.png

[identity profile] mend0za.livejournal.com 2016-07-25 09:01 am (UTC)(link)
addr2line IMHO покажет всё тоже что показал отладчик - строку где был макрос вызван.

[identity profile] norian.livejournal.com 2016-07-25 09:04 am (UTC)(link)
бляди, сэр (с)

коты используют макросы только для свёртки макросов дебажной инфы (строка, файл, функция), ну или для загрузки однотипных тестовых данных в коде

[identity profile] inconceivable2.livejournal.com 2016-07-25 09:13 am (UTC)(link)
А нельзя его запрепроцессить сначала, а затем уже запрепроцессереный файл компилить? Тогда укажет на развернутый макрос, может, понятнее станет.

[identity profile] swizard.livejournal.com 2016-07-25 10:39 am (UTC)(link)
+1, отладка printf-ами, а как ещё-то

[identity profile] swizard.livejournal.com 2016-07-25 10:40 am (UTC)(link)
Зачастую макросы в однострочник раскрываются, так что это тоже не поможет.

[identity profile] denisioru.livejournal.com 2016-07-25 02:08 pm (UTC)(link)
Не писать макросы на три страницы. Если критичен unrolling и inlining - у компиляторов есть опции.

[identity profile] juan-gandhi.livejournal.com 2016-07-25 02:47 pm (UTC)(link)
Я бы предложил не отлаживать ничего вообще. Иметь достаточно тестов и монад.

[identity profile] metaclass.livejournal.com 2016-07-25 03:08 pm (UTC)(link)
Не могу найти ни одного языка, в котором была бы нормальная система типов и при этом он позволял бы делать dll с сишным апи и работал на 2003 виндах.
Пару здоровенных проектов с нуля переписывать, похоже, гиблое дело - надо по частям на микросервисы перетаскивать, а там сплошные доисторические винды, фанатики-безопасники и админы с антивирусами, которые winapi и сеть ломают и прочее в том же духе.
Наверно, проще сменить работу было бы, но это не спортивно :)

[personal profile] alll 2016-07-25 04:09 pm (UTC)(link)
Гм, а если скажем строка макроса длинной в десяток экранов редактора, как выглядит процесс отладки в человеческой операционкосреде?

[identity profile] denisioru.livejournal.com 2016-07-25 05:14 pm (UTC)(link)
Ну почему так сразу. Просто перегибы бывают :))

[identity profile] juan-gandhi.livejournal.com 2016-07-25 05:23 pm (UTC)(link)
Да, сочувствую.

Насчет же неспортивности, я как-то постепенно пришел к выводу, что мне время моей жизни дороже, чем понты доказывать тормозам, что ты не тормоз. Главное, а смысл? Через 10 лет это все пройдет, а время потрачено. На, в сущности, фигню.

[identity profile] psilogic.livejournal.com 2016-07-25 06:22 pm (UTC)(link)
как переход на С++

[personal profile] alll 2016-07-25 07:26 pm (UTC)(link)
Гм. В Си есть какое-то ограничение на длину макроса, которого нет в C++?

[personal profile] alll 2016-07-25 07:31 pm (UTC)(link)
Гм. По прошествии достаточного времени скорее всего выяснится, что при любом раскладе время потрачено на в сущности фигню (кроме быть может детей и студентов, да и то не уверен). Останется только выбор между фигнёй, которая радовала в процессе занятия ею и фигнёй, которая огорчала. :)

[identity profile] psilogic.livejournal.com 2016-07-25 08:09 pm (UTC)(link)
в С++ есть шаблоны, конструкторы и pointer-to-member, которые покрывают over 95% случаев, когда в С нужен длинный макрос

конечно, все перечисленное, мягко говоря, не идеально, но... сравниваем не с идеалом, а с макросами

[identity profile] psilogic.livejournal.com 2016-07-25 08:10 pm (UTC)(link)
хорошо сказано :)

[personal profile] alll 2016-07-25 09:06 pm (UTC)(link)
[Задумчиво перечитывает очередное сообщение компилятора об ошибке при инстанцировании шаблона] о, да! Дас ист фантастиш!

Но конкретно в случае уже написанного кем-то макроса (увы, мир не идеален, иногда приходится работать с унаследованным или 3rd party кодом) C++ и самая-правильная-среда-разработки мало чем могут помочь. :(

[identity profile] psilogic.livejournal.com 2016-07-25 09:22 pm (UTC)(link)
Шаблоны ужасны, а шаблоны STL - вообще паноптикум. Но это все же лучше макросов - хотя бы можно отлаживаться.

В случае уже написанного - да, проблема. Одна из многих :)

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

Но опять же - если 3rd party не сделала проект под эту среду - само создание проекта, скорее всего, займет слишком много времени.

ygrek.org.ua

[identity profile] ygrek (from livejournal.com) 2016-07-25 11:07 pm (UTC)(link)
Камло умеет.
Некоторые умельцы вон даже сделали целиком на камле замену для сишного libtls.

[identity profile] ykaliuta.livejournal.com 2016-07-27 04:37 am (UTC)(link)
gcc -E -dD жЭ

[identity profile] blackyblack.livejournal.com 2016-07-27 08:22 am (UTC)(link)
Перестать трахать стюардессу и воткнуть C++.

[identity profile] blackyblack.livejournal.com 2016-07-27 08:24 am (UTC)(link)
C++ и foreach макрос? Но зачем?!

[identity profile] blackyblack.livejournal.com 2016-07-27 08:27 am (UTC)(link)
По прошествии времени ещё и бабло может остаться. Так что выбор несколько шире.

[personal profile] alll 2016-07-27 09:03 am (UTC)(link)
Начиная с некоторого уровня бабло не "может остаться", а просто остаётся, вопрос только в количестве. Но если вдруг оно кого-то радует в особо больших количествах, то выбор в сущности тот же.

[identity profile] blackyblack.livejournal.com 2016-07-27 09:05 am (UTC)(link)
Для вечноголодного метакласса это вопрос принципиальный. :)

[identity profile] psilogic.livejournal.com 2016-07-27 09:11 am (UTC)(link)
так короче
- ваш Кэп

[personal profile] alll 2016-07-27 09:11 am (UTC)(link)
Судя по его упорному сидению в одной позиции который год, принципиально для совсем другое. "Лучше быть нужным, чем свободным", евпочя.

[identity profile] blackyblack.livejournal.com 2016-07-27 09:13 am (UTC)(link)
Ясно. Тут бы извернуться и сделать generic FOR_EACH для всего, но ХЗ как.

[identity profile] psilogic.livejournal.com 2016-07-27 09:38 am (UTC)(link)
совсем для всего вряд ли получится, а если хочется единообразия для разных типов контейнеров - тогда через одинаковые названия итераторов и методов у итераторов по аналогии с std::for_each и вообще #include <algorithm>
Edited 2016-07-27 09:40 (UTC)

[identity profile] usovalx.livejournal.com 2016-07-28 09:12 pm (UTC)(link)
apt-get install indent

Ваш кэп ;)

[identity profile] cottidianus.livejournal.com 2016-08-16 08:20 am (UTC)(link)
зашел сюда вот это написать

спасибо, сэкономили мне время :)