Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отчет об ошибках, Реализация отчета об ошибках 
:(
    Опции темы
NYX
Дата 13.6.2012, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 9.1.2007
Где: Россия, Москва

Репутация: нет
Всего: нет



Цитата

И еще бы я посоветовал уделять внимание не только логгерам, но и качеству кода, дабы меньше ошибок было. 


Это само собой smile На скорую руку не люблю делать, нравится во всем ковыряться иногда даже слишком ухожу от всего и вязну в мелочах. В итоге открываются новые видения кода с последующим его совершенством...  Собственно это меня и навело на мысль о том, что пора бы уже по взрослому об ошибках отчитываться  smile 
--------------------
'long long long' is too long for GC
PM   Вверх
Randajad
Дата 14.6.2012, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



А у гцц оказывается есть милый параметр!

Цитата

-finstrument-functions
    Generate instrumentation calls for entry and exit to functions. Just after function entry and just before function exit, the following profiling functions are called with the address of the current function and its call site. (On some platforms, __builtin_return_address does not work beyond the current function, so the call site information may not be available to the profiling functions otherwise.)

              void __cyg_profile_func_enter (void *this_fn,
                                             void *call_site);
              void __cyg_profile_func_exit  (void *this_fn,
                                             void *call_site);
         

    The first argument is the address of the start of the current function, which may be looked up exactly in the symbol table.

    This instrumentation is also done for functions expanded inline in other functions. The profiling calls indicate where, conceptually, the inline function is entered and exited. This means that addressable versions of such functions must be available. If all your uses of a function are expanded inline, this may mean an additional expansion of code size. If you use `extern inline' in your C code, an addressable version of such functions must be provided. (This is normally the case anyway, but if you get lucky and the optimizer always expands the functions inline, you might have gotten away without providing static copies.)

    A function may be given the attribute no_instrument_function, in which case this instrumentation is not done. This can be used, for example, for the profiling functions listed above, high-priority interrupt routines, and any functions from which the profiling functions cannot safely be called (perhaps signal handlers, if the profiling routines generate output or allocate memory). 


Это сообщение отредактировал(а) Randajad - 14.6.2012, 10:34
PM MAIL   Вверх
NYX
Дата 14.6.2012, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 9.1.2007
Где: Россия, Москва

Репутация: нет
Всего: нет



Это практически то, что я и искал! Счас буду ковырять! 
Randajad, честь и хвала тебе! Очень здорово помог!  smile  Чувак, ты реально крут!!!

Так! Нашел вполне себе компилируемый экземпляр...
Код

extern "C" {
    void __cyg_profile_func_enter(void *, void *) __attribute__((no_instrument_function));
    void __cyg_profile_func_enter(void *func, void *callsite) {
        printf("enter %p\n", func);
    }
    
    void __cyg_profile_func_exit(void *, void *) __attribute__((no_instrument_function));
    void __cyg_profile_func_exit(void *func, void *callsite) {
        printf("exit %p\n", func);
    }
}


Результат скомпилился, но вывода нет. Полагаю надо какие то дополнительные параметры компилятору кинуть?
Нашел вроди бы установку параметров в виде:
-finstrument-fnctions
для g++
однако с такими параметрами отказывается компилить, типо unrecognized и все такое  smile 
ВСЕ! РАБОТАЕТ! Я ща помру от радости! ВАХ-ВАХ-ВАХ!  smile  Ваще супер! Осталось только проверить как работает на других компах (виртуалках) под разными ключами.... 

Randajad, спасибо тебе огромное еще раз! Очень здорово помог. Теперь буду ковыряться с найденными тобой декларациями, что да как. Думаю весьма мощная штуковина, можно не только отчет для стека вызовов делать, но и еще какие то навороты, например подготовка объектов и зачистка всякого рода. В общем и в целом одним слово ВЕЩЬ!

Это сообщение отредактировал(а) NYX - 14.6.2012, 16:14
--------------------
'long long long' is too long for GC
PM   Вверх
NYX
Дата 14.6.2012, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 9.1.2007
Где: Россия, Москва

Репутация: нет
Всего: нет



Интересно, а можно ли сделать это не для всех функций, а например только для функций класса или модуля или namespace?
--------------------
'long long long' is too long for GC
PM   Вверх
Randajad
Дата 14.6.2012, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Можно. Там ключики есть. smile

StackWalk - разобрался? Днем руки его объявление найти не дошли.

Это сообщение отредактировал(а) Randajad - 14.6.2012, 19:24
PM MAIL   Вверх
NYX
Дата 14.6.2012, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 9.1.2007
Где: Россия, Москва

Репутация: нет
Всего: нет



to Randajad
Со StackWalk так и не разобрался. По дефолту у меня винвер 0x400 редефайнил на 501 ничего не дало O_o Если честно я даже не знал что его стоит передефайнить. Я думал установщик сам проставляет нужные дефайны исходя из системы на которую ставит...
В общем не удалось мне запустить тот самый код и твоего примера. Я как за комп сяду напишу какие траблы возникли, попробую расковыряться в чем дело.

А можно подробнее про ключики? Ваще где их глянуть можно (в каком разделе gcc мануала)?

Это сообщение отредактировал(а) NYX - 14.6.2012, 20:09
--------------------
'long long long' is too long for GC
PM   Вверх
Randajad
Дата 14.6.2012, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Я - волшебник?

Код

#include <windows.h>
#include <imagehlp.h>
#include <tlhelp32.h>


int main() {
    CONTEXT context;
    STACKFRAME stackframe;

    while(StackWalk(IMAGE_FILE_MACHINE_I386, 0, 0, &stackframe, &context, 0, &SymFunctionTableAccess, &SymGetModuleBase, 0) != 0);
}


Работает. Это весь код main.cpp. С целью проверить компиляцию воткнул.

Добавлено через 25 секунд
Ключики смотреть в гуглике. Этот я именно там нашел.
PM MAIL   Вверх
NYX
Дата 14.6.2012, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 9.1.2007
Где: Россия, Москва

Репутация: нет
Всего: нет



удивительный день волшебства! smile 
еще на подходе красным подчеркивает нетбинс. Ну ради прикола попытался откомпилить... выдал ругачку
undefined reference to `__imp__StackWalk@36'
зачит всеж имеется онное (ну онное имеется безусловно, видел я это в хидере). Но что самое удивительное,
именно такую ругачку вижу впервые при попытке откомпилить. Значит судя по сему надобно:
* либо статически чота прилинковать
* либо создать какой то объект
* либо переобъявить
Что из трех надо сделать буду ковырять в гугле smile по результату отпишуся smile

Цитата

Я - волшебник?

В этом даже сомнений не возникало smile Просто грандиозная помощь, не думал что есть такие люди которые пытаются
понять других людей, при всей сложности собеседника (в лице меня дубалома-любителя)  smile 

Это сообщение отредактировал(а) NYX - 14.6.2012, 23:00
--------------------
'long long long' is too long for GC
PM   Вверх
Randajad
Дата 14.6.2012, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: 8
Всего: 8



Ну да, прилинковать надо, как бы ругается и на что.
imagehlp либа, к сведению.
PM MAIL   Вверх
NYX
Дата 15.6.2012, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 9.1.2007
Где: Россия, Москва

Репутация: нет
Всего: нет



Работает smile
прилинковал соответвтующий *.a

Счас бошка не соображает мальца. Я утром протестирую, хотя в общем то примерно я понял как оно работает smile STACK FRAME как то сразу навело на мысль об устройстве smile

Это сообщение отредактировал(а) NYX - 15.6.2012, 03:11
--------------------
'long long long' is too long for GC
PM   Вверх
NYX
Дата 15.6.2012, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 9.1.2007
Где: Россия, Москва

Репутация: нет
Всего: нет



Цитата

-finstrument-functions-exclude-file-list=file,file,...
Set the list of functions that are excluded from instrumentation (see the description of -finstrument-functions). If the file that contains a function definition matches with one of file, then that function is not instrumented. The match is done on substrings: if the file parameter is a substring of the file name, it is considered to be a match.
For example:

          -finstrument-functions-exclude-file-list=/bits/stl,include/sys
     
excludes any inline function defined in files whose pathnames contain /bits/stl or include/sys.

If, for some reason, you want to include letter ',' in one of sym, write '\,'. For example, -finstrument-functions-exclude-file-list='\,\,tmp' (note the single quote surrounding the option). 

-finstrument-functions-exclude-function-list=sym,sym,...
This is similar to -finstrument-functions-exclude-file-list, but this option sets the list of function names to be excluded from instrumentation. The function name to be matched is its user-visible name, such as vector<int> blah(const vector<int> &), not the internal mangled name (e.g., _Z4blahRSt6vectorIiSaIiEE). The match is done on substrings: if the sym parameter is a substring of the function name, it is considered to be a match. For C99 and C++ extended identifiers, the function name must be given in UTF-8, not using universal character names. 


Тока я чот не совсем понял, там судя по всему перечисляются не имена функций и имена файлов, в которых списком обозначены имена функций (дабы что бы не брахлить опшенцы длиннющими списками. Наверно так...

А, кстати! Для исключения функций указывается аттрибут __attribute__((no_instrument_function)), собственно если убрать строки деклараций с атрибутами для _cyg_profile_func_* то получается вечная рекурсия. Соответственно для всех функций входящих в состав "пользовательских \ объявленных пользователем" можно установить такой аттрибут и функция будет исключена. Так что нафиг списки в опциях. Все пользовательские функции которые являются подвызовом _cyg_profile_function_* надо изолировать аттрибутом. Иначе будет вечная рекурсия. Кстати если использовать например внутри *_enter и *_exit векторы с их push_back \ pop_back, то получается так же самая рекурсия. Так что выход наверно такой, не заморачиваться с вектором и сделать свой стек простенький для протоколирования вызовов. В общем под это дело можно целый-отдельный модуль выделить, где первоначально объявляются все эти дебаггерские дела и функции "страдающие" производительностью (напр. рендеры или функции связанные со временем или может даже потоки... всех их можно заблаговременно изолироваться от инструментария функционала простым аттрибутом. Это просто грандиозно!

Это сообщение отредактировал(а) NYX - 15.6.2012, 20:29
--------------------
'long long long' is too long for GC
PM   Вверх
NYX
Дата 1.8.2012, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 9.1.2007
Где: Россия, Москва

Репутация: нет
Всего: нет



Товарищи, а как на ваш взгляд, имеет ли смысл реализовывать такую стратегию отчета об ошибках?

Программа реализована в виде двух модулей. Первый модуль исполняемый, второй модуль отчетный.
В исполняемом модуле имеется некий класс-прокси, который отвечает за вызов модуля отчета, в т.ч. обеспечение
ожидания в случае множественных вызовов из разных потоков. Класс-прокси является так же синглтоном и имеет
в своем теле функцию __stdcall предназначеную для переопределения SetUnhandledExceptionFilter. Далее, для
определения логической ошибки, производится вызов функции класса-прокси с указанием базовых данных в виде
__FUNCTION__ и кода ошибки. В случае runtime ошибки так же производится вызов модуля отчета, но уже с более
полной информацией о сбое. Производится вызов модуля отчета под средством CreateProcess. Модуль отчета
имеет обработку аргументов из cmd строки, которые позволяют:
очистить лог
записать лог

Далее, для чего такой костыль? Я вот так подумал, я же ведь могу получить доступ из одного процесса к другому процессу?
Может быть мне будет проще сделать дамп слетевшего процесса из внешнего + это будут два раздельных процесса
и у каждого своя виртуальная память, не разделяемая. В случае тотального пипца модуль отчета будет жив как не крути.
В случае если надо будет просмотреть стек вызовов, то в том же олли могу поставить брейкпоинт на вызове функции
прокси-класса и в момент завершения\слета посмотреть в олльге стек вызовов. Этого будет достаточно думаю. А
дамп и прочее можно будет потом дописать в модуле отчета, как бы со временем дополняя функционал. А модуль исполняемый
как есть, так и есть. Все что он может сделать, так это выполнять код. Модуль отчета можно например отдать на рабработку
члену группы, какому нибудь системщику которые с асмом дружит как пчела с цветком ВАХ!

Самый прикол в том, что я написал уже некую заготовку такой штуковины, вполне работает, модуль отчетности занимает
копейки и прежде чем полностью повесить проц, надо запустить ну что то около нцати сотен экземпляров близкому к тыщячи  smile 
Есть ли где нибудь описание опдобного метода? Насколько взрослым является такой метод?

Это сообщение отредактировал(а) NYX - 1.8.2012, 20:55
--------------------
'long long long' is too long for GC
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1047 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.