Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В VC++2005 нет вывода сообщений от TRACE-ов 
:(
    Опции темы
torero
Дата 3.2.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



     Месяца три назад я уже задавал этот вопрос по VC2005, но потом решил, что причина ошибки в пиратской копии.   
Теперь установил новую копию VC++2005. Скачана она с сайта DreamSpark, по описанию в нём фирма Мicrosoft позволяет приобретать лицензионный софт.
Запустил  большую программу с графическими файлами, меню, диалогами, MDI и т.д. , всё отработало без единой ошибки. Но!
Запускаю программу в режиме Debug | Win32 и в окне Output от операторов TRACE() нет ни одного сообщения. Причём системные сообщенмя есть и в Output-Debug и в Output- Build .
Примерно такие:   'Prov.exe': Loaded 'C:\Program Files\Portrait Displays\Pivot Software\Winphook.dll', Binary was not built with debug information.      // почему not build ?
                               The program '[1688] Prov.exe: Native' has exited with code 0 (0x0).

Взял простейшие примеры из MSDN 2005 ,  в ProvView.cpp включил  #include "atlbase.h"  и в OnDraw включил TRACE( ):
 
Код

                                                                     pDC->TextOutW(10,10,_T("Привет всем"));
                                                                      TRACE("Вывoд TRACE");
                                                                      ATLTRACE2("Вывод ATLTRACE2");
                                                                       int i = 1;
                                                                       ATLTRACE2( atlTraceGeneral, 4, "Integer = %d\n", i );       // Output: 'Integer = 1'
                                                                       ATLTRACE2( traceAppMsg,4,"Integer = %d\n", i ); 

Оператор TextOutW () сообщение на экран вывел, но ни одного сообщения в окне Output не появилось.  В чём дело?
Поскольку я не получил ни одного ответа в других форумах, то решил высказать предположения :
1. Причина в кодировке Unicod и нужно по другому оформлять TRACE.  (До этого я работал в 6-ой студии).
2. Может быть причина в Windows XP Professional, версия 2002, Service Pack-2 .
3. Может быть кроме окон Output-Debug и Output-Build есть ещё третье окно для отладочных сообщений ??
PM MAIL   Вверх
Earnest
Дата 4.2.2009, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Все 3 твоих предположения неверны. TRACE не имеет никакого отношения к TextOut, и делать какие-то выводы на основе того, что кто-то из них работает, а кто-то нет - бессмысленно. Окно Output это и есть окно, куда выводтся трассировочные сообщения.
То, что ты называешь системными сообщениями - это работа OutputDebugString. TRACE'ы в итоге тоже вызывают ровно эту функцию. ATLTRACE - тоже самое, что TRACE. 

Управляется это дело, во-первых, макро-флагом _DEBUG (кстати проверь, что он у тебя установлен: debug-сборка сама по себе еще не означает, что он стоит. Т.е. по умолчанию среда действительно задает его при создании проекта, но сдуру ума его могли и прибить). Кроме того, есть еще специальные флаги внутри самого TRACE. Т.е. убедись сначала, что _DEBUG у тебя установлен - грубо говоря, что ты можешь зайти отладчиком внутрь TRACE, а дальше пройди по шагам.



--------------------
...
PM   Вверх
torero
Дата 4.2.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



      В ProvView.cpp cтоят операторы :
Код

       #ifdef _DEBUG
       #define new DEBUG_NEW
       #endif

На всякий случай закомментировал их и поставил один : #define _DEBUG    Транслятор выдал   ' _DEBUG'  macro  redefinition
Т.е. _DEBUG переопределён, значит уже есть. Выводов от TRACE по прежнему нет. По каким шагам идти дальше не знаю. Объясни, пожалуйста, подробнее.
PM MAIL   Вверх
Earnest
Дата 5.2.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Ставь точку прерывания на любой свой TRACE и иди внутрь по шагам.
Твоя главная задача - дошагать до функции с именем AtlTraceVA и посмотреть, что там внутри. А внутри-таки должен быть вызов OutputDebugString. Впрочем, возможет и вариант, когда будет установлена и вызвана pfnCrtDbgReport, но там в конце концов тоже дело сводиться к OutputDebugString. Ты должен установить, какие-такие условия тебя туда не пускают. Или даже не пускают дойтить до  AtlTraceVA.
Все это дело происходит у меня в 2003; не думаю, что в 2005 все сильно изменилось, но даже если изменилось - смысл должен остаться: в конце должна быть OutputDebugString.


--------------------
...
PM   Вверх
torero
Дата 6.2.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



       Earnest, макрос TRACE при пошаговом просмотре оказался огромной задачей, примерно 30 методов с уровнем вложения до 6 . ( Потому что это API ).  Дошёл, наконец до такого места:
Код

                 if(pfnCrtDbgReport != NULL)
                   pfnCrtDbgReport(_CRT_WARN,NULL,0,NULL,"%s",szBuf);
                 else   
                         OutputDebugStringA(szBuf);

  Причём выполняется условие if( != NULL)=TRUE, else не выполняется.
   Я убрал условия и оставил безусловный   OutputDebugStringA(szBuf);   Такое нахальство VC++  не понравилось. Сообщения от TRACE() всё равно нет, а при следующем пошаговом просмотре стал вылетать в
 недействительную область.  Пробовал поставить   OutputDebugStringA(szBuf);  прямо в OnDraw , но результат тот же, что и TRACE.
 И такой вопрос: выходит всё-таки, что "лицензионный" софт с пиратскими наклонностями? Что посоветуешь делать.
PM MAIL   Вверх
Earnest
Дата 9.2.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(torero @  6.2.2009,  20:59 Найти цитируемый пост)
Earnest, макрос TRACE при пошаговом просмотре оказался огромной задачей, примерно 30 методов с уровнем вложения до 6 . ( Потому что это API ).

Подумаешь, у меня на это минуты 3 ушло, пока тебе пост писала прошлый раз. У меня тоже идет в if, т.е. вызывается pfnCrtDebugReport; вот там и происходит в конце концов вызов OutputDebugString.
Кстати, с помощью CrtDebug-функций можно свой обработчик туда вставить. Вот и посмотри для начала, куда ведет тебя pfnCrtDebugReport. Возникает такое ощущение, что кто-то перехватывает этот вызов и забирает инфу себе... 
У тебя ничего сверху не стоит?


--------------------
...
PM   Вверх
torero
Дата 9.2.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



     Сейчас и у меня быстрее получается, а первый раз повозился.
        
Цитата

У тебя ничего сверху не стоит?  

  Не понял, где сверху?
 Просмотрел я всю цепочку методов, что-то понял, а что-то нет, ошибку не нашёл. Но вопрос в другом. Я в первом посте привёл пример, четыре строки кодов. Три строки я убираю и остаётся
 безусловный оператор OutputDebugStringA, который мне нужен. Что я сделал неправильно? Но после этого Debuger при пошаговой отладке ( когда вхожу в метод AtlTraceVA ) даёт сообщение,
 что невозможно представить коды в символьном виде и переходит на Assembler. И я уже не могу посмотреть, как работает моё исправление. Подозрение такое, что сбивается адресация.
 Так может быть нужно указать в проекте, что библиотечный файл  atldebugapi.cpp необходимо включить в проект для трансляции и сборки? Или это происходит автоматически?
  Тогда не знаю, почему не действует моё исправление.  
PM MAIL   Вверх
Earnest
Дата 10.2.2009, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



"Сверху" - имелось в виду какое- приложение, плагин или что-то вроде, перехватывающее трассировочный вывод.

Чтобы подействовало твое исправление, нужно перестроить библиотеки, а ты ведь этого не делал, а просто поправил исходный код; поэтому тебе и говорят, что исходный код не соответствует бинарнику.
Но я и не рекомендую тебе перестраивать стандартные библиотеки. Во-первых, геморройное это дело, во-вторых - оснований недостаточно, чтобы в это лезть. Ты ведь дошел до if (pfnCrtDbgReport != NULL), вот и войди внутрь pfnDebugReport, посмотри куда указатель ведет. У меня, например, pfnDebugReport == _CrtDbgReport (функция из CRT-библиотеки). А устанавливается это дело, во-первых, в atltrace.h при инициализации вспомогательного классика CTrace. А еще есть интересный код в CAtlTraceModule::CrtDbgReport. Может, у тебя используется ATL и кто-то переустанавливает эту функцию?


--------------------
...
PM   Вверх
torero
Дата 11.2.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



     Для проверки Debug-а я создал проект Prov, в котором всего один оператор: в OnDraw стоит TRACE("Вывод TRAC-a\n");  Поэтому у меня и сверху ничего нет, и ATL я не использую.
 Может быть ATL в 8-ой студии автоматически подключается, этого я пока не знаю. Далее: и в CAtlTraceModule и в CTrace, на мой взгляд, подключаются _СrtDbgReport.
 Привожу их коды, вроде всё в порядке. 
Код

void CAtlTraceModule::CrtDbgReport(CAtlTraceModule::fnCrtDbgReport_t pfnCrtDbgReport)
{
#ifdef _DEBUG
    m_pfnCrtDbgReport = pfnCrtDbgReport ? pfnCrtDbgReport : _CrtDbgReport;
#else
    m_pfnCrtDbgReport = pfnCrtDbgReport ? pfnCrtDbgReport : NULL;
#endif
}

class CTrace
{
public:
    typedef int (__cdecl *fnCrtDbgReport_t)(int,const char *,int,const char *,const char *,...);

private:
    CTrace(
#ifdef _ATL_NO_DEBUG_CRT
        fnCrtDbgReport_t pfnCrtDbgReport = NULL)
#else
        fnCrtDbgReport_t pfnCrtDbgReport = _CrtDbgReport)
#endif
        : m_hInst(reinterpret_cast<HINSTANCE>(&__ImageBase)),
            m_dwModule( 0 )
    {
        m_dwModule = AtlTraceRegister(m_hInst, pfnCrtDbgReport);
    }

Вообще-то я Win API не знаю, я от С++ сразу перешёл к MFC, поэтому могу и не увидеть ошибку.
PM MAIL   Вверх
Earnest
Дата 12.2.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(torero @  11.2.2009,  20:17 Найти цитируемый пост)
Поэтому у меня и сверху ничего нет, и ATL я не использую.

Я имею в виду какой-нибудь плагин, расширение среды - типа Visual Assist, а не твои программы.

Цитата(torero @  11.2.2009,  20:17 Найти цитируемый пост)
 Далее: и в CAtlTraceModule и в CTrace, на мой взгляд, подключаются _СrtDbgReport.

Да, конечно, это нормально. Вопрос в другом: когда ты доходишь до ветки fnCrtDbgReport, чему равен этот указатель? Ты заходишь именно в _СrtDbgReport или в другую функцию? Третий раз спрашиваю, а ты молчишь как партизан... И если в CrtDebugReport, то доходишь ли до OutputDebugString?




--------------------
...
PM   Вверх
torero
Дата 12.2.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



      Плагинов и прочего у меня нет. Посмотрел содержимое  pfnCrtDbgReport , там ещё вызываются методы,  обозначу их коротко.
           _CRTIMP int __cdecl  _CrtDbgReportT(...) -->  --INLINE INT --cdecl -CrtDbgReportTV(...) --> _CRTIMP int __cdecl  _VCrtDbgReportA(...) --> _VCrtDbgReportT(...);
 OutputDebugString не вызывается, хотя этих операторов там много в разных вариантах, но "стрелка" через них перепрыгнула.
PM MAIL   Вверх
Earnest
Дата 13.2.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Ок, давай сравним \ проследим:
Внутри _CrtDbgReport сначала стоит большой if для обработки ASSERT, мы его проскакиваем, потому что у нас не ассерт.
Дальше, вот в этом коде:
Код

        if (_pfnReportHook)
        {
            if ((*_pfnReportHook)(nRptType, szOutMessage, &retval)) { ...}
        }

_pfnReportHook стоит, но возвращает false и мы идем дальше. Потом еще один if, который мы проскакиваем и, наконец вуаля:
Код

        if (_CrtDbgMode[nRptType] & _CRTDBG_MODE_DEBUG)
        {
            OutputDebugString(szOutMessage);
        }

Вот сюда мы заходим. Так трейс отрабатывает у меня. Если у тебя не заходит в этот if, то видимо дело во флагах _CrtDbgMode (кстати, nRptType у меня 0), и надо искать, какая св.. их портит...


--------------------
...
PM   Вверх
torero
Дата 13.2.2009, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



      У меня всё точно так же. nRptType тоже равно 0. Когда я захожу в OutputDebugStringA( szOutMessage), там такие коды на Ассемблере:
    {
     адрес   lea      eax,[ebp-3028h]
     .........    push   eax
     .........    call     dword  ptr[ __imp__OutputDebugStringA@4(102CC038h)]
    }
 
Цитата

  Так трейс отрабатывает у меня

  Значит это до того, как ты исправила? Что теперь ?
PM MAIL   Вверх
Earnest
Дата 15.2.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Я ничего не исправляла, у меня и так все работает...
Я правильно понимаю, что в OutputDebugString ты заходишь, и в передаваемом аргументе-строке все нормально, но в панель Output ничего не пишется? А тем не менее, какой-то вывод при загрузке приложения в Output есть? Ну ничего себе!
Тогда даже не знаю, что посоветовать... Может, попробуешь среду переставить? Если хочешь дальше разбираться в этом деле, сходи на сайт Руссиновича www.sysinetrnals.com, там есть утилитка DebugView. Во-первых, она умеет хвать вывод OutputDebugString к себе в окно (очень удобно для отладки релиза, который не работате только без среды), но суть не в этом: вроде я когда-то у него видела объяснение принципов как оно там работает и чуть ли не код утилиты. Может, это поможет разобраться.


--------------------
...
PM   Вверх
torero
Дата 15.2.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

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



   
Цитата

в OutputDebugString ты заходишь, и в передаваемом аргументе-строке все нормально, но в панель Output ничего не пишется?

 А вот я не знаю нормально ли всё у меня в аргументе строке. Вот стоит "маркер" Debuger-a на операторе call     dword  ptr[ __imp__OutputDebugStringA@4(102CC038h)]  , и я нажимаю Step Into.
 Мне кажется я должен перейти к области памяти описывающей OutputDebugStringA, ведь это подпрограмма, а не один оператор. Но у меня при нажатии Step Into "маркер" проскакивает
 дальше и выходит из OutputDebugStringA.
   
Цитата

Может, попробуешь среду переставить?

 Хочу просто уточнить, "переставить"-заново инсталлировать Windows XP ?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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