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] 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] 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] 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] blackyblack.livejournal.com 2016-07-27 08:22 am (UTC)(link)
Перестать трахать стюардессу и воткнуть C++.