Невозможный вывод на экран

Автор mihail_1, 12 мая 2013, 06:55:17

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

mihail_1

Вывод приложения при запуске с командной строки перенаправлен в файл (угловой скобкой) и туда и попадает. Но иногда на экран выводятся какие-то двоичные данные вида "їїїїїїїїїїїїїїї&ї'ї(ї)ї*ї+ї,ї-ї.ї/ї0ї1ї2ї3ї4ї5ї6ї7ї8ї9ї:ї;ї<ї=ї•ї–ї—її™їММmС\г}я~яЂяЃя,яѓя,,я...я†я‡я€я‰яЉя‹яЊяЌяЋяЏяђя'я'я"я"я•я–я—яя™яљя›яњяќяћяџя яЎяўяЈя¤яҐя¦я§яЁя©яЄя{1|1}1~1Ђ1Ѓ1,1ѓ1,,1...1†1‡1€1‰1Љ1‹1Њ1Ќ1Ћ1Џ1ђ1'1'1"1"1•1–1—11™1љ1›1њ1ќ1ћ1џ1 1???????????? ?!?"?#?$?%?&?'?(?)?*?+?,?-?.?/?0?TOUOVOWOXOYOZO[O\O]O^O_O`OaObOcOdOeOfOgOhOiOjOkOlOmOnOoOpOqOrOsOtOuOvOwOxOкXлXмXнXоXпXрXсXтXуXфXхXцXчXшXщXъXыXьXэXюXяXYYYYYYЋ_Џ_ђ_'_'_"_"_•_–_—__™_љ_›_њ_ќ_ћ_џ_ _Ў_ў_ЎfўfЈf¤fҐf¦f§fЁf©fЄf«f¬f­f®fЇf°fЭfЮfЯfаfбfвfёo№oєo»oјoЅoѕoЫoЬoЭoЮoЯoаoбoвoгoдoеo@pApBpCpРuСuТuУuФuХuЦuЧuШuЩuЪuЫuЬuЭuЮuЯuаuбuвuгuдuеuжuзк...л...м...н...о...п...р...с...т...у...ф...х...ц...ч...ш...щ...ъ...ы...ь...э...ю...я...†7Ћ8Ћ9Ћ:Ћ;Ћ<Ћ=Ћ>Ћ?Ћ@", которые точно не принадлежат нормальному выводу приложения, непонятно откуда берутся и как пролезают на экран. Запуск под valgrind ничего не меняет, valgrind об ошибках, которые могли бы быть причиной не сообщает. Что это может быть?

qupl

Библиотеки наверняка какие-то используются, там может быть отладочный вывод?

mihail_1

Библиотеки используются стандартные и mysql. Используются не первый день и такого (и к тому же стабильного) эффекта раньше не наблюдалось. Скорее я чего-то в программе накосячил.
Но в программе есть отладочные вывод и он идет на консоль, но на нее не попадает поскольку перенаправлен в файл при запуске. Как же это пролезает?

qupl

И stdout и stderr в файл перенаправлены?

mihail_1

Вот кто из них кто я не совсем представляю. Программа на Си. Выводит printf. Я предполагал что это stdout. Что такое stderr я не знаю, но вероятно на него должны выводиться сообщения об ошибках и тогда надо эти ошибки исправить.

Перенаправляю вывод я ./программа > файл
Что при этом перенаправляется?

Malaheenee

mihail_1, только stdout. stderr вместе с stdout выводится program &> filename.
Все мы где-то, когда-то и в чем-то были новичками.

mihail_1

А как определять какая библиотека может выдавать столь информативные сообщения об ошибках?

Malaheenee

На ум приходит только тупой метод брутфорса - отключать по одной и смотреть вывод.
Все мы где-то, когда-то и в чем-то были новичками.

mihail_1

Это как если шатается табуретка - откручивать по одной ножке пока шататься не перестанет? Такой способ пременим не во всех задачах. У меня приложение собирает обрабатывает и складывает в базу данные, причем в обработке используются ранее положенные в базу данные. Если я у этой табуретки одну ножку откручу она просто упадет.
Пока вернулся к предыдущей версии кода, через несколько часов узнаю результат.

Malaheenee

С базой, говорите работает? А если в самой базе поискать такие двоичные данные, может это какая-то мусорная запись?
Все мы где-то, когда-то и в чем-то были новичками.

mihail_1

#10
По виду это похоже на данные индексного файла mysql, но сравнение с имеюющимися файлами показало существенные отличия. (но даже в случае подтверждения было бы непонятно, почему данные вместо файлов вдруг начали попадать на консоль)

Тест со старой версией сделать не удалось, она не достаточно старая.

Пытаюсь не перенаправляя свой отладочный вывод в файл определить примерное место выдачи этих странных сообщений (не слишком успешно - в программе  более сотни потоков)

Сообщение объединено: 13 мая 2013, 16:55:43

Удалось локализовать это безобразие. Хотя легче не стало.
write, который должен (и раньше нормально это делал) писать в свой файл, почему-то пишет на консоль. Файл открывает функцией open. Открывается успешно, но в него ничего не пишется.

Сообщение объединено: 13 мая 2013, 18:34:12

Осталось неясным почему valgrind не поймал выхода индекса за границу массива - значение переменной испорчено, хорошо что 0 туда прописался. (ну ладно индекс как-нибудь вручную отловлю)

smallNix

Я не большой специалист по valgrind, но даже в статье в wiki написано, что он не очень хорошо обнаруживает ошибки выхода за границы массива, так что не стоит этому удивляться. :) А вообще - кусок программного кода не помешал бы ;)
Кто-то же должен что-то делать...