| "hello, debug window" | |
| От: | Кодт rsdn | ||
| Дата: | 29.11.03 15:24 | ||
| Оценка: | 79 (10) | ||
| При отладке консольных программ (особенно — write only), очень неприятно, что они выводят текст в черное окошко, а не в окно отладчика. Приходится туда-сюда переключаться, ставить breakpoint на конец программы (чтобы не потерять результаты), и т.п. Ниже — решение, позволяющее направлять вывод С++ных стримов в окно отладчика VC. Итак. 1. Сначала научимся писать туда. 2. Затем создадим streambuf, который делает это. 3. Далее создадим ostream с этим буфером. 4. Наконец, научим cout писать в отладочное окно. Подробности — ниже. Перекуём баги на фичи! |
| Re: "hello, debug window" | |
| От: | Кодт rsdn | ||
| Дата: | 29.11.03 15:27 |
К>1. Сначала научимся писать туда.
Вместо _CrtDbgReport(), требующего дебаг-компиляции и линковки, можно использовать WinAPI-шную OutputDebugString.
Перекуём баги на фичи! |
| Re: "hello, debug window" | |
| От: | Кодт rsdn | ||
| Дата: | 29.11.03 15:40 |
| Здравствуйте, Кодт, Вы писали: К>2. Затем создадим streambuf, который делает это. Для этого перекроем 2 функции, которые отвечают за вывод строки и символа.
Перекуём баги на фичи! |
| Re: "hello, debug window" | |
| От: | Кодт rsdn | ||
| Дата: | 29.11.03 15:46 |
| К>3. Далее создадим ostream с этим буфером. Делается элементарно.
Перекуём баги на фичи! |
| Re: "hello, debug window" | |
| От: | Кодт rsdn | ||
| Дата: | 29.11.03 15:54 |
| К>4. Наконец, научим cout писать в отладочное окно. Выполним ту же манипуляцию с rdbuf. Используем паттерн scope guard.
Перекуём баги на фичи! |
| Re: "hello, debug window" | |
| От: | Кодт rsdn | ||
| Дата: | 29.11.03 16:02 |
Наконец, пример использования.
Перекуём баги на фичи! |
| Re[2]: "hello, debug window" | |
| От: | Кодт rsdn | ||
| Дата: | 29.11.03 16:02 |
Маленькая добавка. Аналогично <iostream>.
Перекуём баги на фичи! |
| Re: мои три копейки.... | |
| От: | c-smile | ||
| Дата: | 29.11.03 17:42 | ||
| Оценка: | 7 (2) +1 | ||
| Здравствуйте, Кодт, Вы писали: Классно! А вот мои три копейки в стиле kiss:
|
| Re[2]: мои три копейки.... | |
| От: | Alexey Shirshov rsdn | ||
| Дата: | 30.11.03 08:43 |
| Здравствуйте, c-smile, Вы писали: хъ Про UNICODE забыл. ... << RSDN@Home 1.1.0 stable >> |
| Re[2]: мои три копейки.... | |
| От: | Зверёк Харьковский | ||
| Дата: | 30.11.03 10:28 |
| Здравствуйте, c-smile, Вы писали: CS>А вот мои три копейки в стиле kiss: [зверьковыгрызено] Андрей, kiss, он конечно и в африке kiss. Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет. Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же? STL, конечно, можно сколько угодно считать suxx'ом, но вот весьма нелюбимая тобой концепция потока все же заслуживает уважения. (не обижайся, если что FAQ — це мiй ай-кью! |
| Re: "hello, debug window" | |
| От: | Зверёк Харьковский | ||
| Дата: | 30.11.03 10:30 |
| Здравствуйте, Кодт, Вы писали: [зверьковыгрызено] просто прелесть! FAQ — це мiй ай-кью! |
| Re: "hello, debug window" | |
| От: | Nose | ||
| Дата: | 30.11.03 16:07 |
| Здравствуйте, Кодт, Вы писали: А у меня в чистом виде не работает... VC7.1 Ща буду копаться... ... << RSDN@Home 1.1.0 stable >> |
| Re[2]: "hello, debug window" | |
| От: | Nose | ||
| Дата: | 30.11.03 20:25 |
| Здравствуйте, Nose, Вы писали: N>Здравствуйте, Кодт, Вы писали: N>А у меня в чистом виде не работает... VC7.1 В смысле, не компилится... ... << RSDN@Home 1.1.0 stable >> |
| Re[3]: мои три копейки.... | |
| От: | c-smile | ||
| Дата: | 01.12.03 04:57 |
| Здравствуйте, Зверёк Харьковский, Вы писали: ЗХ>Здравствуйте, c-smile, Вы писали: CS>>А вот мои три копейки в стиле kiss: ЗХ>[зверьковыгрызено] ЗХ>Андрей, kiss, он конечно и в африке kiss. ЗХ>Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет. Это зело философский вопрос... Всякие debugging штуки должны следовать принципу неразрущающего контроля — минимизировать искажения измеряемой среды. Т.е. чем меньше код — тем лучше. Потому как код отладчика отлаживается только руками. ЗХ>Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же? Если у класса уже есть оператор вывода в ТЕКСТОВЫЙ поток, то что мешает вывести тогда этот класс в stderr ? Так как я понимаю эта программа уже расчитана на работу с потоками... Или опять мой здравый смысл не здравый? ЗХ>STL, конечно, можно сколько угодно считать suxx'ом, но вот весьма нелюбимая тобой концепция потока все же заслуживает уважения. Еще раз торжественно клянусь: STL НЕ SUCKS!!!! ( а скорее наоборот ЗХ>(не обижайся, если что Beerа тут и так валом. А вот сала нет. А без него добрым как станешь? И STL как ближнего своего как возлюбишь? Никак... Шли лучче сало бочками! |
| Re[3]: мои три копейки.... | |
| От: | c-smile | ||
| Дата: | 01.12.03 06:09 |
| Здравствуйте, Alexey Shirshov, Вы писали: AS>Здравствуйте, c-smile, Вы писали: AS>хъ AS>Про UNICODE забыл. А зачем здесь UNICODE, объясните мне христа ради? Eсть же "%s" и есть "%S". Или этого недостаточно? А проекты которые компилируются то в UNICODE, то в ANSII есть nonsence. Либо в то, либо в то... А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы. |
| Re[4]: мои три копейки.... | |
| От: | Alexey Shirshov rsdn | ||
| Дата: | 01.12.03 06:15 |
| Здравствуйте, c-smile, Вы писали: [] CS>А зачем здесь UNICODE, объясните мне христа ради? При том, что код не скомпилируется. хъ CS>А проекты которые компилируются то в UNICODE, то в ANSII есть nonsence. Либо в то, либо в то... У меня все такие. И это очень хорошо. CS>А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы. Если тебе так уж не нравится UNICODE — замени OutputDebugString на OutputDebugStringA ... << RSDN@Home 1.1.0 stable >> |
| Re[5]: мои три копейки.... | |
| От: | c-smile | ||
| Дата: | 01.12.03 06:59 |
| Здравствуйте, Alexey Shirshov, Вы писали: CS>>А проекты которые компилируются то в UNICODE, то в ANSII есть nonsence. Либо в то, либо в то... AS>У меня все такие. И это очень хорошо. Везет же людям... Я серьезно. У меня все какие-то задачи получаются дурацкие. Никак они не разделяются на UNICODE ни на ANSII. Например HTML: имя атрибута — ANSII , значение атрибута — когда ascii, когда unicode, а когда вообще какой-нибудь агрегат типа 12pt. А в общем и целом HTML как бы unicode... Ну т.е. #define UNICODE как мертвому припарки. CS>>А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы. AS>Если тебе так уж не нравится UNICODE — замени OutputDebugString на OutputDebugStringA Понял. Согласен. Спасибо большое. Просто я свои проекты всегда компилирую в т.н. ASCII режиме и использую unicode функции windows всегда литерально. Как-то надежнее получается что-ли... IMHO это мое все... |
| Re[3]: "hello, debug window" | |
| От: | Кодт rsdn | ||
| Дата: | 01.12.03 06:59 |
| Здравствуйте, Nose, Вы писали: N>>А у меня в чистом виде не работает... VC7.1 N>В смысле, не компилится... Потому что я не копипастил, а руками печатал. Где-то мог погнать. Сегодня восстановлю° исходник — выложу зипом. Еще одна причина некомпиления — для _CrtDbgReport нужно включить опции дебага (/MLd | /MTd | /MDd). --- ° Вчера в угаре раскурочил — он тоже перестал компилиться Перекуём баги на фичи! |
| Re[4]: мои три копейки.... | |
| От: | Зверёк Харьковский | ||
| Дата: | 01.12.03 08:19 |
| Здравствуйте, c-smile, Вы писали: [зверьковыгрызено] ЗХ>>Андрей, kiss, он конечно и в африке kiss. ЗХ>>Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет. CS>Это зело философский вопрос... CS>Всякие debugging штуки должны следовать принципу неразрущающего контроля — минимизировать искажения измеряемой среды. Т.е. чем меньше код — тем лучше. Потому как код отладчика отлаживается только руками. так вот на мой вкус типобезопасный поток меньше эту самую среду изменит, чем твой вариант, если в него кинуть чего-то, что он не сможет переварить. впрочем, спор "за и против" STL-like потоков, мы кажется, уже вели здесь Автор: c-smile Дата: 26.10.03 ЗХ>>Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же? CS>Если у класса уже есть оператор вывода в ТЕКСТОВЫЙ поток, то что мешает вывести тогда этот класс в stderr ? CS>Так как я понимаю эта программа уже расчитана на работу с потоками... CS>Или опять мой здравый смысл не здравый? а это можно будет сделать прозрачно? покажи, плз, я чего-то недопонимаю. ЗХ>>(не обижайся, если что CS>Beerа тут и так валом. А вот сала нет. А без него добрым как станешь? И STL как ближнего своего как возлюбишь? Никак... CS>Шли лучче сало бочками! (иронически) — ой-вей, а кошерной курятинки вам таки не прислать? ЗЫ: и саппорт HtmLayout'а со мной не общается почему-то... может, обиделся? FAQ — це мiй ай-кью! |
| Re[3]: мои три копейки.... | |
| От: | Кодт rsdn | ||
| Дата: | 01.12.03 09:04 |
| Здравствуйте, Зверёк Харьковский, Вы писали: ЗХ>Андрей, kiss, он конечно и в африке kiss. ЗХ>Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет. ЗХ>Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же? Тем более, что я решал гораздо более простую задачу: вывод строки и одного символа (из недр debugstream'а). А не ставил задачу эмулировать printf. Перекуём баги на фичи! |
| Re[4]: "hello, debug window" | |
| От: | Nose | ||
| Дата: | 01.12.03 09:15 |
| Здравствуйте, Кодт, Вы писали: К>Здравствуйте, Nose, Вы писали: N>>>А у меня в чистом виде не работает... VC7.1 N>>В смысле, не компилится... К>Потому что я не копипастил, а руками печатал. Где-то мог погнать. К>Сегодня восстановлю° исходник — выложу зипом. К>Еще одна причина некомпиления — для _CrtDbgReport нужно включить опции дебага (/MLd | /MTd | /MDd). Не... Первая причина К>--- К>° Вчера в угаре раскурочил — он тоже перестал компилиться ... << RSDN@Home 1.1.0 stable >> |
| Re[6]: мои три копейки.... | |
| От: | Рома Мик | ||
| Дата: | 01.12.03 14:13 |
| Здравствуйте, c-smile, Вы писали: CS>У меня все какие-то задачи получаются дурацкие. Никак они не разделяются на UNICODE ни на ANSII. Хорошие у тебя задачи, полезные. CS>Например HTML: имя атрибута — ANSII , значение атрибута — когда ascii, когда unicode, а когда вообще какой-нибудь агрегат типа 12pt. А в общем и целом HTML как бы unicode... CS>Ну т.е. #define UNICODE как мертвому припарки. Ну так это не мешает тебе использовать TCHAR для имен файлов и прочего, а html разбирать как char. CS>>>А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы. Ну, я бы так не сказал. Дело в том, что без всякой зависимости от задачи, если используются какие-нибудь функции Windows, что CreateWindow, что RegOpenKey, что все остальные в разных виндах — разные. Под win9x — только A, под NT — вроде бы и A, и W, а под WinCE — только W. И что будет дальше не совсем ясно. При том, что использование TCHAR особо не напрягает. CS>Просто я свои проекты всегда компилирую в т.н. ASCII режиме и использую unicode функции windows всегда литерально. CS>Как-то надежнее получается что-ли... Но менее портабельно. Под WinCE ну никак не заведуться твои проекты после этого... ... << RSDN@Home 1.1.0 stable >> Всем срочно гонять паровозы |
| Re[7]: мои три копейки.... | |
| От: | c-smile | ||
| Дата: | 01.12.03 22:16 |
| Здравствуйте, Рома Мик, Вы писали: РМ>Ну так это не мешает тебе использовать TCHAR для имен файлов и прочего, а html разбирать как char. Вот как раз для имен файлов char как-то совсем плохо работает... Особенно у наших друзей на юге и юго-востоке... CS>>>>А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы. РМ>Ну, я бы так не сказал. Дело в том, что без всякой зависимости от задачи, если используются какие-нибудь функции Windows, что CreateWindow, что RegOpenKey, что все остальные в разных виндах — разные. Под win9x — только A, под NT — вроде бы и A, и W, а под WinCE — только W. И что будет дальше не совсем ясно. При том, что использование TCHAR особо не напрягает. Под Win9x существуют CreateWindowW и RegOpenKeyW. И вообще... если твои окна отрабатывают WM_CHAR то о CreateWindowA стоит забыть. Потому как в общем случае в ANSII окне тебе еще и WM_IME_CHAR отрбатывать надо... Ну т.е. код получается тот еще... CS>>Просто я свои проекты всегда компилирую в т.н. ASCII режиме и использую unicode функции windows всегда литерально. CS>>Как-то надежнее получается что-ли... РМ>Но менее портабельно. Под WinCE ну никак не заведуться твои проекты после этого... Хорошо что я этого не знал когда их заводил... |
| Re[8]: мои три копейки.... | |
| От: | Рома Мик | ||
| Дата: | 01.12.03 23:21 |
| Здравствуйте, c-smile, Вы писали: РМ>>Ну так это не мешает тебе использовать TCHAR для имен файлов и прочего, а html разбирать как char. CS>Вот как раз для имен файлов char как-то совсем плохо работает... CS>Особенно у наших друзей на юге и юго-востоке... Во-первых, попробуй вызвать CreateFileW под win9x. Низзя. Во-вторых, прекрасно работает в том числе и у наших африканских друзей: multibyte — это не обязательно singlebyte, даже и слова разные. А ANSI версии виндовых функций работают как раз с multibyte. В остальном стандратная библиотека нам поможет. Там куча всего начинающегося на _tcs. CS>Под Win9x существуют CreateWindowW и RegOpenKeyW. и возвращают ошибку ERROR_CALL_NOT_IMPLEMENTED. Проверенно. Занусси. CS>И вообще... если твои окна отрабатывают WM_CHAR то о CreateWindowA стоит забыть. Почему? CS>Потому как в общем случае в ANSII окне тебе еще и WM_IME_CHAR отрбатывать надо... А зачем? Я честно говоря не в курсе, но разве я не могу для WM_CHAR вызывать WideCharToMultiByte в ANSI варианте и жить спокойно? Необязательно это делать для каждого сообщения, можно только когда данные наружу просят, а внутри все полностью юникодным сделать. Не говоря о том случае, когда английских букв хватает. Да и честно говоря что-то давненько я вообще с WM_CHAR не сталкивался. Его что-то Edit, да RichEdit контролы обрабатывают у меня. РМ>>Но менее портабельно. Под WinCE ну никак не заведуться твои проекты после этого... CS>Хорошо что я этого не знал когда их заводил... Теперь знаешь. Будущие твои проекты... ... << RSDN@Home 1.1.0 stable >> Всем срочно гонять паровозы |
| Re[9]: мои три копейки.... | |
| От: | c-smile | ||
| Дата: | 02.12.03 00:04 |
| Здравствуйте, Рома Мик, Вы писали: CS>>Под Win9x существуют CreateWindowW и RegOpenKeyW. РМ>и возвращают ошибку ERROR_CALL_NOT_IMPLEMENTED. Проверенно. Занусси. Волшебные слова: Microsoft Layer for Unicode / UnicoWS.dll |
| Re[5]: мои три копейки.... | |
| От: | c-smile | ||
| Дата: | 02.12.03 06:33 |
| Здравствуйте, Зверёк Харьковский, Вы писали: От елки-палки.... Люди, я не против предлагаемого решения. Оно классное и полезное! Если вы уже используете потоки ввода/вывода! Я ж об этом сразу сказал! Чего вы сразу как на красну тряпочку... Если вы не используете потоки ввода/вывода, то вам сгодится dprintf... Что за жизнь, а? |
| Re[6]: мои три копейки.... | |
| От: | Kluev | ||
| Дата: | 02.12.03 07:44 | ||
| Оценка: | ![]() | ||
| Здравствуйте, c-smile, Вы писали: CS>Люди, я не против предлагаемого решения. Оно классное и полезное! Если вы уже используете потоки ввода/вывода! CS>Если вы не используете потоки ввода/вывода, то вам сгодится dprintf... Полностью согласен. Я например в своих программах вообще не вижу места где я мог бы применить их (потоки) без потери удобства и производительности. Особенно безумной (прошу не обижатся) я считаю идею юзать потоки для чтения структурированных файлов (xml,step) или сериализации. Поток это штука идеологически неструктурированная (есть только операции запихнуть-выпихнуть в-из потока), а в любых прогах данные являются структурированными и древовидными. Юзать древовидные классы для ввода-вывода гораздо удобнее (пример библиотека TiXml). А рассуждения насчет типоопастности printf-подобных функция вообще напоминают вопли домохозяек, в С++ любой указатель является потенциально опасным и ничего все юзают и не жалуются. ЗЫ: Извиняйте за офтоп. |
| Re[10]: мои три копейки.... | |
| От: | Рома Мик | ||
| Дата: | 02.12.03 09:52 |
| Здравствуйте, c-smile, Вы писали: CS>Здравствуйте, Рома Мик, Вы писали: CS>>>Под Win9x существуют CreateWindowW и RegOpenKeyW. РМ>>и возвращают ошибку ERROR_CALL_NOT_IMPLEMENTED. Проверенно. Занусси. CS>Волшебные слова: Microsoft Layer for Unicode / UnicoWS.dll Угу. Я собственно с ним давно. Только писать везде CreateWindowW и т.д... В студии IntelliSense не работает от этого и т.д. Я уж лучше с tchar'ом как-нибудь. При том, что это проще, это дает больше возможностей. ... << RSDN@Home 1.1.0 stable >> Всем срочно гонять паровозы |
| Re[6]: мои три копейки.... | |
| От: | Зверёк Харьковский | ||
| Дата: | 02.12.03 10:36 |
| Здравствуйте, c-smile, Вы писали: [зверьковыгрызено] ну вот, довел я таки хорошего человека... (ты, человеческий детеныш, кого угодно достанешь...) больше не буду FAQ — це мiй ай-кью! |