| 1 2 |
| "hello, debug window" | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт rsdn | |
| Дата: | 29.11.03 16:24 | |
| Оценка: | 79 (10) | |
| При отладке консольных программ (особенно — write only), очень неприятно, что они выводят текст в черное окошко, а не в окно отладчика. Приходится туда-сюда переключаться, ставить breakpoint на конец программы (чтобы не потерять результаты), и т.п. Ниже — решение, позволяющее направлять вывод С++ных стримов в окно отладчика VC. Итак. 1. Сначала научимся писать туда. 2. Затем создадим streambuf, который делает это. 3. Далее создадим ostream с этим буфером. 4. Наконец, научим cout писать в отладочное окно. Подробности — ниже. Перекуём баги на фичи! |
| Re: "hello, debug window" | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт rsdn | |
| Дата: | 29.11.03 16:27 |
К>1. Сначала научимся писать туда.
Вместо _CrtDbgReport(), требующего дебаг-компиляции и линковки, можно использовать WinAPI-шную OutputDebugString.
Перекуём баги на фичи! |
| Re: "hello, debug window" | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт rsdn | |
| Дата: | 29.11.03 16:40 |
| Здравствуйте, Кодт, Вы писали: К>2. Затем создадим streambuf, который делает это. Для этого перекроем 2 функции, которые отвечают за вывод строки и символа.
Перекуём баги на фичи! |
| Re: "hello, debug window" | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт rsdn | |
| Дата: | 29.11.03 16:46 |
| К>3. Далее создадим ostream с этим буфером. Делается элементарно.
Перекуём баги на фичи! |
| Re: "hello, debug window" | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт rsdn | |
| Дата: | 29.11.03 16:54 |
| К>4. Наконец, научим cout писать в отладочное окно. Выполним ту же манипуляцию с rdbuf. Используем паттерн scope guard.
Перекуём баги на фичи! |
| Re: "hello, debug window" | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт rsdn | |
| Дата: | 29.11.03 17:02 |
Наконец, пример использования.
Перекуём баги на фичи! |
| Re[2]: "hello, debug window" | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Кодт rsdn | |
| Дата: | 29.11.03 17:02 |
Маленькая добавка. Аналогично <iostream>.
Перекуём баги на фичи! |
| Re: мои три копейки.... | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | c-smile | http://terrainformatica.com |
| Дата: | 29.11.03 18:42 | |
| Оценка: | 7 (2) +1 | |
| Здравствуйте, Кодт, Вы писали: Классно! А вот мои три копейки в стиле kiss:
|
| Re[2]: мои три копейки.... | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Alexey Shirshov rsdn | http://wise-orm.com |
| Дата: | 30.11.03 09:43 |
| Здравствуйте, c-smile, Вы писали: хъ Про UNICODE забыл. ... << RSDN@Home 1.1.0 stable >> |
| Re[2]: мои три копейки.... | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Зверёк Харьковский | |
| Дата: | 30.11.03 11:28 |
| Здравствуйте, c-smile, Вы писали: CS>А вот мои три копейки в стиле kiss: [зверьковыгрызено] Андрей, kiss, он конечно и в африке kiss. Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет. Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же? STL, конечно, можно сколько угодно считать suxx'ом, но вот весьма нелюбимая тобой концепция потока все же заслуживает уважения. (не обижайся, если что FAQ — це мiй ай-кью! | |
| Re: "hello, debug window" | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Зверёк Харьковский | |
| Дата: | 30.11.03 11:30 |
| Здравствуйте, Кодт, Вы писали: [зверьковыгрызено] просто прелесть! FAQ — це мiй ай-кью! | |
| Re: "hello, debug window" | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Nose | |
| Дата: | 30.11.03 17:07 |
| Здравствуйте, Кодт, Вы писали: А у меня в чистом виде не работает... VC7.1 Ща буду копаться... ... << RSDN@Home 1.1.0 stable >> |
| Re[2]: "hello, debug window" | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Nose | |
| Дата: | 30.11.03 21:25 |
| Здравствуйте, Nose, Вы писали: N>Здравствуйте, Кодт, Вы писали: N>А у меня в чистом виде не работает... VC7.1 В смысле, не компилится... ... << RSDN@Home 1.1.0 stable >> |
| Re[3]: мои три копейки.... | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | c-smile | http://terrainformatica.com |
| Дата: | 01.12.03 05:57 |
| Здравствуйте, Зверёк Харьковский, Вы писали: ЗХ>Здравствуйте, c-smile, Вы писали: CS>>А вот мои три копейки в стиле kiss: ЗХ>[зверьковыгрызено] ЗХ>Андрей, kiss, он конечно и в африке kiss. ЗХ>Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет. Это зело философский вопрос... Всякие debugging штуки должны следовать принципу неразрущающего контроля — минимизировать искажения измеряемой среды. Т.е. чем меньше код — тем лучше. Потому как код отладчика отлаживается только руками. ЗХ>Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же? Если у класса уже есть оператор вывода в ТЕКСТОВЫЙ поток, то что мешает вывести тогда этот класс в stderr ? Так как я понимаю эта программа уже расчитана на работу с потоками... Или опять мой здравый смысл не здравый? ЗХ>STL, конечно, можно сколько угодно считать suxx'ом, но вот весьма нелюбимая тобой концепция потока все же заслуживает уважения. Еще раз торжественно клянусь: STL НЕ SUCKS!!!! ( а скорее наоборот ЗХ>(не обижайся, если что Beerа тут и так валом. А вот сала нет. А без него добрым как станешь? И STL как ближнего своего как возлюбишь? Никак... Шли лучче сало бочками! |
| Re[3]: мои три копейки.... | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | c-smile | http://terrainformatica.com |
| Дата: | 01.12.03 07:09 |
| Здравствуйте, Alexey Shirshov, Вы писали: AS>Здравствуйте, c-smile, Вы писали: AS>хъ AS>Про UNICODE забыл. А зачем здесь UNICODE, объясните мне христа ради? Eсть же "%s" и есть "%S". Или этого недостаточно? А проекты которые компилируются то в UNICODE, то в ANSII есть nonsence. Либо в то, либо в то... А TCHAR придумали враги, потому как ANSII и UNICODE есть две большие разницы. |
| Re[4]: мои три копейки.... | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Alexey Shirshov rsdn | http://wise-orm.com |
| Дата: | 01.12.03 07: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 | http://terrainformatica.com |
| Дата: | 01.12.03 07: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 07:59 |
| Здравствуйте, Nose, Вы писали: N>>А у меня в чистом виде не работает... VC7.1 N>В смысле, не компилится... Потому что я не копипастил, а руками печатал. Где-то мог погнать. Сегодня восстановлю° исходник — выложу зипом. Еще одна причина некомпиления — для _CrtDbgReport нужно включить опции дебага (/MLd | /MTd | /MDd). --- ° Вчера в угаре раскурочил — он тоже перестал компилиться Перекуём баги на фичи! |
| Re[4]: мои три копейки.... | Оценить ![]() ![]() ![]() ![]() ![]() ![]() |
| От: | Зверёк Харьковский | |
| Дата: | 01.12.03 09: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 10:04 |
| Здравствуйте, Зверёк Харьковский, Вы писали: ЗХ>Андрей, kiss, он конечно и в африке kiss. ЗХ>Однако ж keep'ать simple это не значит забывать, к примеру, о типобезопасности. Каковой здесь, в общем-то, и не пахнет. ЗХ>Кроме того, Кодтово решение предполагает прозрачный вывод в поток любого класса, имеющего оператор вывода в поток. Ты можешь добиться того же? Тем более, что я решал гораздо более простую задачу: вывод строки и одного символа (из недр debugstream'а). А не ставил задачу эмулировать printf. Перекуём баги на фичи! |
| 1 2 |