Никак не вижу решения своей задачи.
Есть софт на C, он компилится и в зашифрованном виде работает у клиента на сервере.
Иногда софт падает и зачастую эти ситуации возникают редко и в особых условиях.
Тогда нужно отдебажить софт на сервере клиента, естественно исходники туда нести нельзя.
gcc -g использовать нежелательно, но даже с ним gdbserver + gdb на локальной машине помогает не всегда. Что уж говорить о core — он даёт ещё меньше информации.
Самый топорный и надёжный способ поиска проблемы в коде, это поиск строки после которой исполнение кода прекращается.
ВОПРОС: каким инструментом добавить в C код в каждую строку метку "такая-то строка исполнилась". Чтобы таким образом записать во внутреннюю структуру с очередью последние N номеров строк, которая и будет сбрасываться в файл debug.log в момент SIGSERV.
Или у GCC есть что-то стандартное для этих целей ?
Здравствуйте, begemoti, Вы писали:
B>ВОПРОС: каким инструментом добавить в C код в каждую строку метку "такая-то строка исполнилась". Чтобы таким образом записать во внутреннюю структуру с очередью последние N номеров строк, которая и будет сбрасываться в файл debug.log в момент SIGSERV.
B>Или у GCC есть что-то стандартное для этих целей ?
Есть ключ -finstrument-functions, который позволяет выполнять произвольные действия на каждый вход или выход из функции.
Так можно узнать не только в какой функции произошло событие, но и получить список вызовов функций, которые событию непосредственно предшествовали, то есть по сути определить строку.
Здравствуйте, watch-maker, Вы писали:
WM>Так можно узнать не только в какой функции произошло событие, но и получить список вызовов функций, которые событию непосредственно предшествовали, то есть по сути определить строку.
Интересно. Это конечно лучше чем ничего, но это мне не даст строку, поэтому нужно что-то другое.
Здравствуйте, begemoti, Вы писали:
B>Здравствуйте, watch-maker, Вы писали:
WM>>Так можно узнать не только в какой функции произошло событие, но и получить список вызовов функций, которые событию непосредственно предшествовали, то есть по сути определить строку.
B>Интересно. Это конечно лучше чем ничего, но это мне не даст строку, поэтому нужно что-то другое.
Это не даст тебе строку только если в предыдущей строке не было вызовов функции. Вообще строку узнать не получится разве что внутри функции целиком состоящей только из математических расчётов или вызовов внешних неподконтрольных функций (типа системных, или скомпилированных другим компилятором). В обычном же случае можно довольно точно определить нужный регион.
Здравствуйте, begemoti, Вы писали:
B>Добрый день!
B>Никак не вижу решения своей задачи. B>Есть софт на C, он компилится и в зашифрованном виде работает у клиента на сервере. B>Иногда софт падает и зачастую эти ситуации возникают редко и в особых условиях. B>Тогда нужно отдебажить софт на сервере клиента, естественно исходники туда нести нельзя.
B>gcc -g использовать нежелательно, но даже с ним gdbserver + gdb на локальной машине помогает не всегда. Что уж говорить о core — он даёт ещё меньше информации.
B>Самый топорный и надёжный способ поиска проблемы в коде, это поиск строки после которой исполнение кода прекращается.
B>ВОПРОС: каким инструментом добавить в C код в каждую строку метку "такая-то строка исполнилась". Чтобы таким образом записать во внутреннюю структуру с очередью последние N номеров строк, которая и будет сбрасываться в файл debug.log в момент SIGSERV.
B>Или у GCC есть что-то стандартное для этих целей ?
А чем корка не устраивает? Делаешь при релизе — с и без -g, Клиенту отдаешь без -g. Берешь корку себе — и загружаешь ее в гдб для версии с -g. Или дело в шифровании? С этим не работал, а это каким образом достигается?
Здравствуйте, pzhy, Вы писали:
P>А чем корка не устраивает? Делаешь при релизе — с и без -g, Клиенту отдаешь без -g. Берешь корку себе — и загружаешь ее в гдб для версии с -g. Или дело в шифровании? С этим не работал, а это каким образом достигается?
core и даже gdb на работающем процессе часто были бесполезны при самых элементарных ошибках (или я просто не умею ими пользоваться).
Тупое втыкание меток в код мне всегда давало более продуктивный результат.
Ищу интеллегентный способ втыкать такие метки
Кстати, может кто посоветует — хочу хороший парсер GNU (с его расширениями) C кода, на любом языке.
Здравствуйте, begemoti, Вы писали:
B>core и даже gdb на работающем процессе часто были бесполезны при самых элементарных ошибках (или я просто не умею ими пользоваться). B>Тупое втыкание меток в код мне всегда давало более продуктивный результат. B>Ищу интеллегентный способ втыкать такие метки
Меня выше описанная методика не подводила. Но еще раз — два бинарника (и набор библиотек) — с и без -g(у обоих -O2 и т.д., -O3 — не знаю). Берем корку от первого и загружаем для второго. У меня всегда работает.
B>Кстати, может кто посоветует — хочу хороший парсер GNU (с его расширениями) C кода, на любом языке.
KDevelop — очень хорошо парсит, про расширения GNU C — не уверен. но даже с boost::spirit и BOOST_PP_VARIADIC_SIZE справляется. Vim + Clаng — парсит все — но медленно(давно пробывал — обещали кэш прикрутить).
Здравствуйте, pzhy, Вы писали:
P>Меня выше описанная методика не подводила. Но еще раз — два бинарника (и набор библиотек) — с и без -g(у обоих -O2 и т.д., -O3 — не знаю). Берем корку от первого и загружаем для второго. У меня всегда работает.
У меня шифруется на уровне асма, поэтому этот способ не подходит.
Вот парсер ищу чтобы быстро скриптом добавлять эти метки.