|
|
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Есть приложение Win32, в котором предусмотрен режим ведения протокола путем записи в текстовый файл. Приложение часто падает по GPF. При этом, самые важные участки протокола, по которым разработчик может понять, в чем причина падения, в протоколе не сохраняются, т.к. данные в протокол выводятся порциями – для ускорения работы: файл протокола открывается, какое-то время туда пишутся данные, потом через какое-то время он закрывается и открывается вновь для записи новой порции данных. Соответственно, самый важный кусок данных, «относящихся» к падению приложения, в протокол обычно не сохраняется, т.к. файл не успевает закрыться по причине падения приложения. Можно ли сделать примерно следующее? Написать программу, которая будет каким-то образом перехватывать обращения к функциям записи в файл, и делить поток вывода в файл, например, по имени файла – если идет запись в файл с определенным именем, то кидать эти данные не на диск, а отправлять по TCP/IP другому приложению, которая будет данные ловить и сохранять себе в память. Если же идет запись в файл с именем, отличным от заданного, вызывать стандартный обработчик записи в файл. Интересна принципиальная возможность такого решения и возможная трудоемкость. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 12:38 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
не проще попробовать после каждой записи в файл делать что-то вроде FlushFileBuffers? перехватывать конечно возможно. вопрос только какими функциями пользуется программа (стандартными виндовыми WriteFile..., mfc, borland vcl...) есть программа filemon которая позволяет смотреть что делается с файлами (не помню, пишет ли она в лог сами данные) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 12:55 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
мысли в слух Как я понимаю вы хотите внешним приложением перехватить сам WriteFile мне кажется, что это слишком, вот мои мысли по этому вопросу. Я не понял кто разработчик. Если это вы, т.е. вы имеете доступ к исходным текстам, то решить эту проблему не сложно. Например, периодически сбрасывать буфер файла на диск(flush), выбрать быстрый диск, вариантов очень много. Но с другой стороны раз вы хотите создать внешнее приложение, то значит программист не вы, а нужно это программистам, пусть они и морочатся с этим им это во много раз проще. Если приложение держит лог в памяти и сбрасывает его только по наполнению, то заставить приложение сбросить может только приложение или какие-либо функции приложения. это задача разработчиков и передачей по сети это не решить. единственное, возможно, я не так понял про что разговор. и я не знаю что такое GPF, т.е. возможно, если узнаю, то всё станет ясно:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 12:55 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Если ты разработчик, то напиши нормальное сохранение в лог. Если нет, то зачем тебе эти данные, всё равно ошибку ты не исправишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 13:19 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Предложите разработчикам заменить функцию буферизации логов функцией непосредственной записи на диск. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 13:22 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Пояснения. 1. Доступа к коду нет, программа разрабатывается сторонней организацией. Таким образом: · FlushFileBuffers – если это совет как организовать протоколирование, он не подходит, т.к. доступа к коду нет; · каким функциями пользуется программа - не известно, это нужно выяснять (думаю, что выяснить это можно); · я почитал описание FileMon; она мониторит откуда, в какие файлы и что было записано; мне же важно вообще не писать в файл (а писать в память, например) чтобы выиграть в скорости; 2. "пусть программисты и морочатся с этим им это во много раз проще." . Программисты говорят, что единственный вариант поймать падение приложения в протокол – это закрывать файл протокола после записи каждой строки и снова его открывать. Но в этом случае приложение начинает работать настолько медленно, что в режиме реальной работы использовать данный подход невозможно (окна открываются по полминуты и.т.п.). Падения же происходят в случайные моменты времени, поэтому воспроизвести падения специально не представляется возможным. 3. "Если приложение держит лог в памяти и сбрасывает его только по наполнению, то заставить приложение сбросить может только приложение или какие-либо функции приложения." . Во-первых - см. п.1, во-вторых, если приложение держит лог в памяти, то после падения приложения лог в памяти пропадает вместе с упавшей задачей… 4. "передачей по сети это не решить" . Идея состоит в том, чтобы писать лог действительно в память, но не в память приложения, которое падает, а в память другого приложения. Передача по сети – это один из способов направить данные другому приложению. Потом запускать это приложение на компьютерах у пользователей и ловить падения в режиме реальной работы. 5. GPF –General Protection Faults ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 14:09 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
avk-75Пояснения. Программисты говорят, что единственный вариант поймать падение приложения в протокол – это закрывать файл протокола после записи каждой строки и снова его открывать. пробовали послать их подальше и не плотить денек ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 14:37 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
SoftIce ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 14:42 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) avk-75Пояснения. Программисты говорят, что единственный вариант поймать падение приложения в протокол – это закрывать файл протокола после записи каждой строки и снова его открывать. пробовали послать их подальше и не платить денек ? +1 Это их проблемы, а не ваши, пусть сами и решают... А если они не умеют не падать часто в GPF, то пусть сами напишут утилитку, которая будет ловить месаги (ну или сокеты, Shared Memory и т.д. и т.п.) и записывать лог на диск. Это разгрузит основную прогу от работы с медленными дисками (раз уж это так критично с т.з. производительности) + "утилита" сможет мониторить состояние основной задади и восстанавливать её после падения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 14:55 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Полностью согласен, что прогу должны писать сами программисты. Как уже сказали, если данные не пишутся стандартными функциями в файл, то ловить нечего (неизвестно что). Для того, чтобы данные были точно записаны на диск нужно просто после записи данных делать сброс буфферов (flush). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 15:30 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Пускай разветвлят логи. По старому и в сокет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 15:38 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
"Как уже сказали, если данные не пишутся стандартными функциями в файл, то ловить нечего (неизвестно что)." Согласен. Тут необходимо знать - как осуществляется запись в файл протокола. Если какое-то время данные для протокола пишутся просто в память приложения (не файловыми функциями), а потом в какие-то моменты времени сбрасываются на диск, то ловить нечего. Если данные пишутся на диск все время стандартными функциями, но без Flash’а – тогда можно пытаться ловить… Тогда изменю вопрос. Способы, как это можно сделать самим разработчикам. Здесь приводилось два: - Сокеты - Shared Memory Есть ли еще варианты? Поясню: данных в протокол выводится очень много (на самом деле очень много). Если передавать через сеть, возможно падение производительности сети. Про Shared Memory не слышал… А задача, напомню, - быстро писать данные протокола куда-то (если в память, то по крайней мере не в память падающего приложения). P.S. Стоп! А может какой-нибудь виртуальный диск сделать (как в DOS’е было – RAMDRIVE)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 15:58 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
avk-75Если передавать через сеть, возможно падение производительности сети. Есстественно через циклический интерфейс на этот же компьютер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 16:02 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Да можно всё сделать и по разному. Данных ооочень много, много на сколько, сотни килобайтов, мегабайтов, гигабайтов? И виртуальный диск можно сделать, и в файл в памяти можно писать, и скорее всего можно успеть на обычный диск данные скидывать(ведь там тоже через дисковый кэш всё работает это ведь не дос без смартдрайва) всё что хочешь! Сейчас ведь вопрос уже в другом - кто это должен делать. Этим должны заниматься разработчики, и им должно быть лучше видно как это сделать учитывая текущую специфику. А гадать тут бесполезно, если они не решили эту задачу, то и другую могут не решить, вопрос не технический. %) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 16:07 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
авторданных в протокол выводится очень много неправильный мониторинг авторвиртуальный диск файл в памяти авторне в память падающего приложения wm_copymemory файл в памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 16:13 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
avk-75Тогда изменю вопрос. Способы, как это можно сделать самим разработчикам. Здесь приводилось два: - Сокеты - Shared Memory Есть ли еще варианты? Поясню: данных в протокол выводится очень много (на самом деле очень много). Если передавать через сеть, возможно падение производительности сети. Про Shared Memory не слышал… А задача, напомню, - быстро писать данные протокола куда-то (если в память, то по крайней мере не в память падающего приложения). P.S. Стоп! А может какой-нибудь виртуальный диск сделать (как в DOS’е было – RAMDRIVE)? 1) если использовать сокеты, то а) нужно использовать моментальную отправку (могут быть маленьчкие тайм ауты на некоторых протоколах - к примеру TCP/IP) б) сам протокол занимает время (разруливание колизий, обрыв связи и прочее)... 2) шаред мемори - это в принцепе и есть один из самых быстрых способов под форточками передать кусок данных в другой процесс. 3) виртуальный диск - думаю скорость данного решения под вопросом... Помимо маршалинга (что и в шаред мемори) надо будет заботиться о форматировании на уровне фата и прочее... Пару слов о задачи... 1) Чтобы локализовать проблемы в программе существуют различные методы. Приведённая Вами - одна из них. Но технологически она предназначена (её плюсы) - не лежат в плоскости падежей программного обеспечения. Обычно данный способ лучше даёт насчупать логические ошибки в многопоточном приложении(ях). 2) Для локализации падежа, лучше подходит методология разделения кода "по отсекам", с помощью трай-кэтч блоков и типизирования исключений. Точнее даже я бы так сказал - не типизирования, а однозначной идентификации некоего своего типа эксепшенов (дешевше при производстве обходиться). Получаемый стэк падежа при ошибках - достаточно точно описывает причины и однозначно указывает на проблемы. с уважением (круглый) ЗЫ Вы даже не представляете, сколько людей в IT области занимаются тем, чем в общем то и не умели никогда... ЗЫ ЗЫ Пожелаю удачи Вам и программистам исполнителям - она потребуется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 16:18 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
To Guest1232123: "вопрос уже в другом - кто это должен делать" Зависит от выбранного способа: если организовать виртуальный диск, это можно сделать самостоятельно, если же что-то дописывать в приложении, конечно, лучше чтобы делал разработчик. Данных выводятся в протокол - десятки мегабайт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 17:02 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Просто разработчикам тоже нужна идея… ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 17:03 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
avk-75 Зависит от выбранного способа: если организовать виртуальный диск, это можно сделать самостоятельно Зависит от того, как они пишут в лог... может и не помочь... avk-75Данных выводятся в протокол - десятки мегабайт. Это в секунду? ) Что за задача такая? avk-75Просто разработчикам тоже нужна идея… Это уже не разработчики, а просто кодеры... Студенты вам пишут, что-ли? Короче, расслабьтесь, и напрягайте их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 17:19 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Ну допустим… я прикинул - в секунду выводится в протокол от 10 до 900 килобайт текста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 18:28 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
avk-75Просто разработчикам тоже нужна идея… повторюсь - задача решаема и думаю легко. идеи разработчикам: общие 1. Структурировать программу. 2. задействовать механизм обработки исключений. http://www.sql.ru/forum/actualthread.aspx?tid=311723#2851060 конкретные 1. сколько времени будет идти поток, если пару секунд, то и винт с виндовым кешем справится. Во всяком случае это быстрее чем сеть. 2. хотя что я то напрягаюсь, удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 18:36 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
avk-75Есть приложение Win32, в котором предусмотрен режим ведения протокола путем записи в текстовый файл. Приложение часто падает по GPF. При этом, самые важные участки протокола, по которым разработчик может понять, в чем причина падения, в протоколе не сохраняются. Так всегда былоб что если приложение падает и в это мне виноват клиент, значит виноват разработчик. на то они и программисты, что приложения пишут. Начинать лучше с самого простого-не верю если они даже не догадываются какой кусок кода вызывает падение. Если знают, то надо использовать мех-м обработки исключений, типа try, throw и catch. А если таким программерам сказать написать еще и стороннюю программу, которая это все будет проверять-больше времени уйдет.да и в итоге-не работаает их программа, а ДОЛЖНА работать.не верю что опытный программист не догадываеься хоть примерно о том, что не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2006, 19:39 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
avk-75Ну допустим… я прикинул - в секунду выводится в протокол от 10 до 900 килобайт текста. Не верте им, что закрытие и открытие файла сильно затормозит приложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2006, 09:27 |
|
||
|
Требуется оценить трудоемкость задачи
|
|||
|---|---|---|---|
|
#18+
Есть в Win32 API функция OutputDebugString и есть у sysinternals утилитка DebugView позволяющая перехватывать вывод этой функции. Для разаботчиков трудоемкость вставки вызова этой функции вместо или вместе с записью в файл наверное невелика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2006, 13:00 |
|
||
|
|

start [/forum/search_topic.php?author=Tekila&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 638ms |
| total: | 806ms |

| 0 / 0 |
