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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить место, где возникла ошибка 
V
    Опции темы
xTr1m
Дата 16.3.2012, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте, подскажите пожалуйста. Есть код, который в определенных местах вызывает такую функцию
Код

bool CSomeClass::GetAttr(Instance *object, Attr *attr)
{
    if(0 == object) 
    {
        MessageBox("Null object detected");
        return false;

    //... производим операции
}


Но на самом деле такое сообщение мало чего дает мне как программисту, так как не понятно из какого места оно получилось. Поэтому хочется иметь какой-нибудь механизм распознания. 
Единственное, что мне приходит в голову, это вместо сообщения кидать исключение и в каждом месте его ловить. Тогда я смогу точно определить проблемный кусок кода. Но эта функция будет вызываться в оооочень многих местах и всюду делать try-cath вроде не хочется. Может есть еще способы?
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 16.3.2012, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



__FILE__, __LINE__, __FUNCTION__/__PRETTY_FUNCTION__

Добавлено через 1 минуту и 6 секунд
можно еще стек вывести. но это наверняка лишнее)
PM WWW   Вверх
xTr1m
Дата 16.3.2012, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо большое, а вот про стек можно по подробнее. Так как уж больно заманчиво звучит =))
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 16.3.2012, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



это зависит от используемого компилятора/ОС. лучше спросить гугл.
PM WWW   Вверх
xTr1m
Дата 16.3.2012, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По поводу __FUNCTION__ , попробовал сделать так
Код

bool CSomeClass::GetAttr(Instance *object, Attr *attr, const char *funcName /*= __FUNCTION__*/)
{
    if(0 == object) 
    {
        MessageBox(funcName);
        return false;
    //... производим операции
}

но получил
Код

error C2457: '__FUNCTION__': predefined macro cannot appear outside of a function body

То есть параметром по умолчанию передать не удалось. Пока вижу два выхода. При каждом вызове функции передавать __FUNCTION__ явно (что конечно не очень).
Или написать макрос на эту функцию. Но макрос тоже как то не совсем.

PM MAIL WWW ICQ   Вверх
boostcoder
Дата 16.3.2012, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(xTr1m @  16.3.2012,  10:57 Найти цитируемый пост)
Или написать макрос

обычно макросом это и делается.
PM WWW   Вверх
xvr
Дата 16.3.2012, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Простой способ. Собираете ваше приложение с отладочной информаций, запускаете. Когда видите MessageBox с "Null object detected" запускаете студию и коннектитесь к своему запущенному приложению, нажимаете в дебагаре break и смотрите стек вызовов

Еще вариант - вместо MessageBox пишете функцию типа error(...), в ней делает что хотите (для вывода ошибки). Загружаете программу под дебагером, ставите точку останова на ваш error и запускаете программу. Когда точка останова сработает - смотрите стек

PM MAIL   Вверх
xTr1m
Дата 16.3.2012, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



xvr, дело в том, что ошибка возникает уже у клиента. И понять почему нереально при текущей архитектуре. А так согласился на вариант с макросом. Спасибо.
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 16.3.2012, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(xTr1m @  16.3.2012,  11:19 Найти цитируемый пост)
ошибка возникает уже у клиента

в таком случае, обычно создается лог-файл который отправляется разработчику.
PM WWW   Вверх
borisbn
Дата 16.3.2012, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



xTr1m, посмотри это


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xTr1m
Дата 16.3.2012, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



borisbn, штука классная, но такое ощущение, что в svn тамошнем в папке externals чего то не хватает. а именно нет вот этого "#include "../externals/StackWalker/StackWalker.h"". Может еще можно где то взять?
PM MAIL WWW ICQ   Вверх
xTr1m
Дата 16.3.2012, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В недрах интернета удалось найти недостающий класс =))
PM MAIL WWW ICQ   Вверх
borisbn
Дата 16.3.2012, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



xTr1m, здорово. А выложи сюда архив со всеми требуемыми для компиляции файлами, пожалуйста.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xTr1m
Дата 16.3.2012, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот тут все в кучу. В проекте примерно так
Код

#include "call_stack.hpp"
...
stacktrace::call_stack st;
cout << st.to_string();


Это сообщение отредактировал(а) xTr1m - 16.3.2012, 15:46

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  stacker.rar 20,92 Kb
PM MAIL WWW ICQ   Вверх
xvr
Дата 16.3.2012, 16:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(xTr1m @  16.3.2012,  11:19 Найти цитируемый пост)
xvr, дело в том, что ошибка возникает уже у клиента.

Тогда плсмотрите сюда. С помощью minidump'а вы сможете посмотреть, что случилось у клиента

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.0758 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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