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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ваш кэп ;)

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

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

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

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

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

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

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

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

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

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

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

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

ygrek.org.ua

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

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

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

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

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 26th, 2025 01:24 am
Powered by Dreamwidth Studios