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

Поиск:

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


Бывалый
*


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

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



Всем привет. Не так давно возникла потребность (личная, не коммерческая) в создании простой, но эффективной системы отчета о событиях. Сначала задался писать простенькие процедуры и функции, затем все переросло в класс, потом в два класса, которые в целом позволяют делать отчеты с описанием и без описания + разные навороты с версиями и прочее прочее. В общем в итоге все обросло таким мусором, что хочется плюнуть на это все и... растереть! В общем, после недолгих мозговых потугов до меня дошла определенная идея. Может идея и бредовая (так полагаю в плане производительности она не айс), но наверно это то, что вполне может меня удовлетворить smile
Вот некоторая концепция:
* Система отчета является базовым классом, который методом простеньких и не очень хаков, позволит произвести протоколирование маршрутов вызовов
* Каждая вызываемая функция дает знать о том что ее вызвали
* В итоге, не сильно сложный класс, занимающийся отловом известных ошибок, в случае возникновения ошибки класс как то хитро выдергивает МАРШРУТ вызовов и соответственно вставляет соответствующую информацию в лог ошибок.
Дабы не раскрывать секреты исходных кодов, можно например записывать маршрут вызовов на подобии такого: 00-12-46-03-11 ERROR #1039 "Произошло что то ужасное!"

Вот.

За коим фигом я обращаюсь на форум? Хотелось бы услышать:
1) Какие средства мне могут ваще поспособствовать написанию подобного бреда
2) Не в коем случае не интересуюсь иными методами, и посты типа - оставь свой велосипед и goto КАКАЯ_ТО_ЛИБА
3) Как можно реализовать базовый класс, позволяющий произвести отчет о вызовах? Ну грубо говоря - обертка, дает определенный номер (для начала int 4 байта) каждой функции, и при вызовах\завершению функции, пихать\извлекать номер вызываемой функции (как в стек прям!).

Вот.

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

(!) может даже можно поразмышлять о бинарных деревьях smile Ну типо, тут бит, там бит ... о том где чо вызывалось

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


Бывалый
*


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

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



Наверно нужна посредственность вызовов функций. Что то вроди оболочки, которая своевременно делала бы отпечаток в анналах при вызове и завершении. Чисто вот гепотетически... да-не, даже практически, на асме это реализуемо. Вот как бы блин вывернуть сустав компилятору (и самое главное какой из них) чтоб такое заделать...? Не у кого мыслишек нет? smile
--------------------
'long long long' is too long for GC
PM   Вверх
alexvs11
Дата 13.6.2012, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



NYX, если речь идет про gcc, то там есть backtrace

http://www.gnu.org/software/libc/manual/ht...Backtraces.html
http://www.linuxjournal.com/article/6391

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

я видел и более экзотическое решение - с аттачем gdb и выводом его бектрейса

Это сообщение отредактировал(а) alexvs11 - 13.6.2012, 21:51
PM MAIL   Вверх
NYX
Дата 13.6.2012, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ща зафигурим.... интересно...
Я никогда не философствовал для себя на тему отчета об ошибках, но счас реально внапряг стало выискивать ошибки через дебаггер, да и система отчета типо ->
Код

report(__FILE__, __LINE__, __FUNCTION__, OutDescript(666));

<- дает посредственное описание. Один фиг все через дебаггер прогонять приходится. Если пользователь вышлет лог с такими ошибками, это ооочень долго разбираться smile очень долго... если ошибок много... а их много. И не всегда они в логе отображают то, что хотелось бы. А в случае экстренного слета хотелось бы подробнее знать. Ну экстренные случаи (непредвиденные) они все равно разбирательств потребуют и наверно описанный мною метод не проканает... там наверно уже лучше отслеживать состояние проги из внешнего процесса, который в случае слета наблюдаемой проги будет хотя бы работоспособный...

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


Опытный
**


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

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



backtrace под виндами не работает, что увы.

Добавлено через 1 минуту и 5 секунд
Под виндами можно заюзать StackWalk. Только название функций через него не получить, ибо гцц не умеет пдбшки делать. Но основная задача - адреса функций - вполне.
PM MAIL   Вверх
NYX
Дата 13.6.2012, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Под виндузятину бэктрейс походу отсутствует  smile 
по крайней мере не инклудится <execinfo.h> как бы я его не взывал! По причине отсутствия.... эх! Прощайте мечты о светлом будущем!

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


Опытный
**


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

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



Афтар не успел. smile
Я выше как раз написал об этом.

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


Бывалый
*


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

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



тока тока гугль меня на StackWalk послал... тока с пометкой об MSVC smile ща гляну... чо за зверь
--------------------
'long long long' is too long for GC
PM   Вверх
Randajad
Дата 13.6.2012, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кусочек из моего логгера:

Код

void GetThreadCallStack(buffer &str, CONTEXT *Context, HANDLE hThread, HANDLE hProc) {
    CONTEXT context;
    memcpy(&context, Context, sizeof(context));

    STACKFRAME stackframe;
    memset(&stackframe, 0, sizeof(stackframe));

    stackframe.AddrPC.Mode   = AddrModeFlat;
    stackframe.AddrPC.Offset = context.Eip;

    stackframe.AddrFrame.Mode   = AddrModeFlat;
    stackframe.AddrFrame.Offset = context.Ebp;

    stackframe.AddrStack.Mode   = AddrModeFlat;
    stackframe.AddrStack.Offset = context.Esp;

    while(StackWalk(IMAGE_FILE_MACHINE_I386, hProc, hThread, &stackframe, &context, 0, &SymFunctionTableAccess, &SymGetModuleBase, 0) != 0) {
        char buf[sizeof(IMAGEHLP_SYMBOL) + 128];
        IMAGEHLP_SYMBOL *sym = (IMAGEHLP_SYMBOL *)buf;

        sym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL);
        sym->MaxNameLength = sizeof(buf) - sizeof(IMAGEHLP_SYMBOL);

        IMAGEHLP_MODULE module;
        module.SizeOfStruct = sizeof(IMAGEHLP_MODULE);

        bool is_func_name = SymGetSymFromAddr(hProc, stackframe.AddrPC.Offset, 0, sym);
        bool is_module_name = SymGetModuleInfo(hProc, stackframe.AddrPC.Offset, &module);

        const char *unk = "???";
        str.aprintf("\t%s: in %s at %p\n", is_module_name ? base_name(module.ImageName) : unk, is_func_name ? sym->Name : unk, stackframe.AddrPC.Offset);
    }
}


Так сказать псевдокод. Чистое winapi.
PM MAIL   Вверх
NYX
Дата 13.6.2012, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Блин под gcc (MinGW) такого нет.
Но смысл примерно ясен. А вот еще, тут про ANSI дефолты прочел, что типо можно так:
Код

void FooNction(int any_x) throw(any_var) { ... }

Можно заместо throw что то свое подставить? не знаю как сформилуровать мыслю на счет throw. Да и ваще если бы можно было бы обойтись без постоянной реализации однотогоже кода в теле функции было бы круто... потому что throw как бы... в общем эт так, мысли в слух...

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


Опытный
**


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

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



Что за блин? Это винапи и писалось под гцц. Работает на любом компиляторе.

Добавлено через 1 минуту и 53 секунды
Нельзя так, увы.
PM MAIL   Вверх
NYX
Дата 13.6.2012, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Окей, тогда по порядку.
STACKFRAME - не нашлось не в одном хидере, искал по содержимому.
StackWalk - аналогично. Да к тому же под MinGW не одного засвета. Тока под VC нашлось типо... у гугля нет ассоциаций таких с этими двумя весчами smile Я могу тупить... не исключено. Если это так, то буду непомерно благодарен за указанный курс направления, где искать эти две штуки хитрые, СтэкРамка и СтекХодить

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


Опытный
**


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

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



У меня заинклюдены:
Код

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

Где-то тут.

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

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


Бывалый
*


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

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



Черт побери. Есть такие. Не уж то винда 7я в корень оскотинилась ищет кое как :( дать бы поддых тому кто виндус придумал  smile 
Работает...
Поторопился. StackWalk по прежнему не работает...

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


Опытный
**


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

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



Поиск в вянде всегда был неадекватным, это да.

Кстати, чтобы функции Sym* работали нужно делать до вызова сий выше приведенной функции это:
SymInitialize(hProc, 0, TRUE);

И после надо бы:
SymCleanup(hProc);

Везде, где hProc - хэндл текущего процесса. Хотя на другие тоже можно натравить...  smile

Добавлено @ 22:52
Я с планшета в кроватке, мне тяжело искать. Завтра поищу, если не разберешься.
Может WINVER=0x501 забыл или еще что? smile

Это сообщение отредактировал(а) Randajad - 13.6.2012, 22:54
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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