реклама на сайте
подробности

 
 
> Обязательный префикс функции.
jcxz
сообщение Aug 3 2016, 08:47
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Интересно - есть-ли у IAR возможность вставки префикса в начало каждой функции при компиляции?
Т.е. - чтобы после входа в каждую функцию в проекте, после PUSH, он вставлял некий фиксированный код (hook). Возможно это несколько ассемблерных строк или просто вызов функции BL (естественно с предварительным сохранением исходного LR на стеке). Видел такую возможность у какого-то компилятора, не помню точно, но вроде у CCS.
Думаю добавить в проект функционал контроля стеков задач. И думаю как это удобнее всего сделать. С помощью такого хука это можно было-бы реализовать.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Aug 4 2016, 05:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вроде бы всю жизнь это называлось "пролог".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 4 2016, 06:29
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Aug 4 2016, 11:37) *
Вроде бы всю жизнь это называлось "пролог".

По этому слову в доке IAR тоже ничего не находится.... sad.gif
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 4 2016, 06:59
Сообщение #4


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 4 2016, 09:29) *
По этому слову в доке IAR тоже ничего не находится.... sad.gif


Специально залез в доку IAR посмотреть наличие проблемы, потому как немыслимо чтобы IAR не выделял внимания контролю стека.
Ну и точно, там море возможностей прецизионно контролировать стек.
Читайте EWARM_DevelopmentGuide.ENU.pdf со страницы 92

Цитата(jcxz @ Aug 4 2016, 05:58) *
Не поверите, но sprintf() не использую нигде в embedded (в IAR и CCS по-крайней мере). В IAR-проектах вместо неё использую _Printf() - она удобнее.


Почему же, верю.
В моих проектах можно найти по 3-4 отдельных автономных реализаций sprintf.
Ибо каждая RTOS, каждый пакет претендующий на мультиплатформенность содержит файлы с переписанными стандартными библиотеками C-и.
Это не удобство, а трагедия, поскольку возникает еще один повод для путаницы.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 4 2016, 08:23
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 4 2016, 12:59) *
Специально залез в доку IAR посмотреть наличие проблемы, потому как немыслимо чтобы IAR не выделял внимания контролю стека.
Ну и точно, там море возможностей прецизионно контролировать стек.
Читайте EWARM_DevelopmentGuide.ENU.pdf со страницы 92

Именно эту доку я и изучал. На этой странице у меня "CHOOSING A LINKER CONFIGURATION FILE" и др. мало относящиеся к контролю стека главы.
Не сочтите за труд указать название главы?

Цитата(AlexandrY @ Aug 4 2016, 12:59) *
Ибо каждая RTOS, каждый пакет претендующий на мультиплатформенность содержит файлы с переписанными стандартными библиотеками C-и.
Это не удобство, а трагедия, поскольку возникает еще один повод для путаницы.

Я не гонюсь за мультиплатформенностью. Она малополезна в embedded, когда проект привязан даже не только к ядру, но и более сильно - периферии.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 4 2016, 08:40
Сообщение #6


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 4 2016, 11:23) *
Не сочтите за труд указать название главы?

Я не гонюсь за мультиплатформенностью. Она малополезна в embedded, когда проект привязан даже не только к ядру, но и более сильно - периферии.


"Stack usage analysis"

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

Открытые проекты с исходниками все поголовно мультиплатформенные, это не нам решать, это их природа такая, иначе они не выживают.
Мы их берем и затачиваем.
А если не можем заточить, то юзаем GCC и говорим что это круто. biggrin.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 4 2016, 10:11
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 4 2016, 14:40) *
"Stack usage analysis"

Не подходит. Толку от него мало. В коде куча косвенных вызовов функций.
И это не подходит: but if there are indirect calls (calls using function pointers) in your application, you must supply a list of possible functions that can be called from each calling function.
Так как не я один пишу этот код, а есть товарищи, любящие всякие классы с виртуальными член-функциями и пихающие их куда нужно и не нужно. А заставить их делать это для своего кода - нереально. Да и малоэффективно.
Да и опять-же - в случае использования чужого кода (всяких стеков и либ), что делать? Шерстить весь этот код для supply a list of possible functions???
Нужен именно run-time контроль, а не build-time.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 4 2016, 12:38
Сообщение #8


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 4 2016, 13:11) *
Не подходит. Толку от него мало. В коде куча косвенных вызовов функций.

Так как не я один пишу этот код, а есть товарищи, любящие всякие классы с виртуальными член-функциями и пихающие их куда нужно и не нужно. А заставить их делать это для своего кода - нереально. Да и малоэффективно.


Не куча, а где нибудь в районе сотни.
IAR все косвенные вызовы аккуратно показывает в Call graph-е.

Если у вас есть к тому же товарищи, то раздать им по десятку таких вызовов и вы за день сделаете управляющий файл для анализатора вызовов.
По любому косвенные вызовы надо знать в лицо, как самые граблеопасные места.

Про эффективность не понял. Анализатор вызовов абсолютно точно считает стек.
И если стоит задача урезать максимально стек лучшего способа не существует.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 5 2016, 08:28
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 4 2016, 18:38) *
Если у вас есть к тому же товарищи, то раздать им по десятку таких вызовов и вы за день сделаете управляющий файл для анализатора вызовов.
По любому косвенные вызовы надо знать в лицо, как самые граблеопасные места.

Это Вы так считаете. И я. А товарищам объяснить невозможно - они всё равно делают как делали и не хотят ни в чём разбираться. А ПО потом глючить начинает совсем в другом месте, не там где набыдлокодили.

Цитата(AlexandrY @ Aug 4 2016, 18:38) *
Про эффективность не понял.

Неэффективно, так как требует постоянного контроля кода, заполнения чего-то там при каждом изменении/добавлении/убирании этих самых функций. Да и ещё и правильного заполнения. 100% что забудут добавить или неправильно добавят или.... и всё насмарку - опять ищи почему глючит.
Механизм контроля должен быть внешний, не требующий постояных трудозатрат на его поддержание и чтобы его один раз реализовал и забыл. И только включать быстро (одним дефайном или ещё чем) когда надо и отключать когда не надо.
А иначе проще тогда уж по-старинке: залить стеки шаблоном и глазами проконтролировать затёртость шаблона.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 5 2016, 10:52
Сообщение #10


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 5 2016, 11:28) *
Неэффективно, так как требует постоянного контроля кода, заполнения чего-то там ...


Т.е. хотите забабахать статистический движок как в линуксах?
И стека не жалко, и ресурсов процессорного времени и риалтайма?

Я думаю если даже Segger этого не сделал, то это никому и не надо.
Старых добрых методов хватает.

Да и статистика дело тонкое.
Не скажете же заказчику после того как все рухнуло, что вероятность переполнения стека была всего то 0.1% с уровнем доверия 95% при эмпирической гипотезе о распределении.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 8 2016, 11:24
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 5 2016, 16:52) *
Т.е. хотите забабахать статистический движок как в линуксах?
И стека не жалко, и ресурсов процессорного времени и риалтайма?

Причём тут какой-то движок? Причём тут заказчик??? Речь идёт об отладке ПО и средствах отладки.
Идея простейшая: при каждом изменении SP (в си - после входа в функцию и выделения стекового фрейма), проверять SP на допустимость (нахождение в некотором диапазоне адресов). Переменные, хранящие контролируемый диапазон, обновлять при каждом переключении задач (в соответствующем хуке ОС).
Это если бы была возможность написать свой пролог функции.
Если нет, другой способ: так же контролировать SP на нахождение в диапазоне только периодически, как можно чаще, в высокочастотном таймерном прерывании.

Дополнительного стека для этого не нужно. Процессорное время конечно нужно, но этот контроль нужно включать только тогда когда нужно - при отладке, при возникновении подозрения на переполнение стека, при каком-то непонятном поведении ПО, чтобы отбросить вариант переполнения стека.
Когда проверять не нужно - просто комментируем соответствующий #define и всё. У меня сейчас так же уже реализована проверка на максимальную длительность запрета прерываний в ПО: запускается ВЧ прерывание и контролируются интервалы времени между прерываниями. Работает отлично - уже не одно место нашёл, где коллеги кривыми ручками надолго запрещали прерывания, нарушая тем самым работу драйверов периферии.
Можно конечно по-старинке: просматривать затёртость шаблона заполнения стека. Но это менее удобно и самое главное - высока вероятность пропуска некоторых случаев переполнения стека.

Идеально было-бы если бы процессорное ядро имело средства контроля выхода SP за некий диапазон - генерило какое-либо исключение в таком случае. Но разработчики ядра не позаботились об этом, жаль...
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 9 2016, 11:29
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Aug 8 2016, 14:24) *
Идеально было-бы если бы процессорное ядро имело средства контроля выхода SP за некий диапазон - генерило какое-либо исключение в таком случае. Но разработчики ядра не позаботились об этом, жаль...

Ну здрассте. Есть же watchpoint, он же data breakpoint.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 9 2016, 11:42
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Aug 9 2016, 17:29) *
Ну здрассте. Есть же watchpoint, он же data breakpoint.

А каким образом с его помощью можно контролировать SP или доступ к памяти через SP?
Оно вроде насколько я знаю только контролирует доступ к памяти вне зависимости от регистра из которого была запись/чтение. Или у меня J-Link какой-то урезанный???
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 9 2016, 13:07
Сообщение #14


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 9 2016, 14:42) *
А каким образом с его помощью можно контролировать SP или доступ к памяти через SP?


Да никак, никому это не нужно.

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

Другое дело с конфликтами прерываний. Но не вижу способа чем может помочь в этом еще одно высокочастотное прерывание.
Какое бы оно не было высокочастотное оно все равно случится постфактум, когда все уже сбилось и рухнуло.

В таких вещах просто вставляется диагностический код, но не тотально везде, а целевой, на поиск только определенной ошибки по известному диагнозу.

Скажем засекаем метки времени в своем прерывании и делаем останов когда время затянулось дольше обычного.
Правда без таймлайна JLink тут тоже мало толку будет.
Таймлайн это все!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 10 2016, 06:37
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 9 2016, 19:07) *
Да никак, никому это не нужно.
Сначала скажите, вы боретесь с ошибкой или с саботажем?
Если с ошибкой, то ставите watchpoint на проблемном месте и находите баг за считанные минуты. Тут даже говорит не о чем.

Я вижу саботаж только здесь. laughing.gif
Вы действительно не понимаете сути вопроса или это троллинг?
Мне кажется вопрос кристалльно ясен. Ситуация:
void f()
{
char b[100];
b[0] = некое_выражение;
...
}
Эта функция вызывается когда до границы стека текущей задачи осталось например 50 байт.
Внимание вопросы:
Что будет со стеком и с SP?
Что будет с памятью, находящейся ниже стека текущей задачи?
Каким образом при помощи watchpoint (или каких-то других сервисов) обнаружить факт выхода SP за границы стека текущей задачи (и записи по SP) в такой ситуации?
При условии что в памяти расположенной ниже стека текущей задачи, могут находиться другие переменные, запись в которые через другие регистры (не SP) - штатна, и запись через SP из других задач - штатна, и не должна вызывать срабатывания механизма обнаружения переполнения стека.
В качестве доп. условий: работа идёт в многозадачной среде, есть N задач, каждая со своим стеком.

Цитата(AlexandrY @ Aug 9 2016, 19:07) *
Другое дело с конфликтами прерываний. Но не вижу способа чем может помочь в этом еще одно высокочастотное прерывание.
Какое бы оно не было высокочастотное оно все равно случится постфактум, когда все уже сбилось и рухнуло.

Если частота его будет такова, что прерывания будут происходить каждые десяток-два команд, то высока вероятность того, что SP уже сбился и выполнение начало куда-то уходить, но содержимое регистров/памяти ещё не успело разрушиться настолько что невозможно найти место где произошло выполнение или CPU вообще не завис.
Т.е. - функция то исправна, и она продолжает выполняться, ну разрушила она чужую память, находящуюся ниже её стека, ну были там адреса возврата, по которым PC улетит в неизвестном направлении, но это случится только когда ОС передаст управление той задаче, чьи данные были разрушены. Это может быть не скоро и до этого успеет сработать ловушка по ВЧ прерыванию, контролирующая SP.

Вот был у нас такой реальный факт переполнения стека:
Проблемный стек, переполнялся только иногда, когда по протоколу обмена устройству приходили только определённые запросы от клиента в заранее непредсказуемое время, которые обрабатывались задачей обработки протокола обмена сессионного уровня. Ниже проблемного стека находилась область памяти связных блоков данных (построенная типа массива блоков фиксированного размера, выделяемых динамически по запросу драйверов каналов связи). В эти блоки драйвера каналов связи писали входящие кадры протокола обмена (и исходящие тоже).
Устройство может работать по нескольким каналам связи одновременно, все драйвера каналов связи асинхронны друг к другу.
Симпотмы проявления: иногда почему-то устройство не отвечало на запросы клиента, причём совершенно произвольно - то всё ок, то какие-то запросы почему-то терялись. Хотя канал связи - идеальный, помех не должно быть.
И вот как тут можно было решить, что переполняется стек одной из задач? И как обнаружить проблемное место куда надо вставить этот диагностический код?

Цитата(AlexandrY @ Aug 9 2016, 19:07) *
В таких вещах просто вставляется диагностический код, но не тотально везде, а целевой, на поиск только определенной ошибки по известному диагнозу.
Скажем засекаем метки времени в своем прерывании и делаем останов когда время затянулось дольше обычного.

Это Вы про то что я писал про контроль длительности запретов прерываний? Ну так у меня это примерно так и работает, только не надо ставить такие метки в каждое прерывание, убирать их и пр. гемор. Просто разрешается некий #define, начинает работать ВЧ прерывание, выполняющееся на высшем приоритете, и оно измеряет временные интервалы между своими вызовами и если есть преывешние - ахтунг! - попадаем в ловушку.
В любой момент когда возникло подозрение можно этто define включить и проверить. Это просто. Хочется чтобы и контроль стека включался так же просто.
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 10 2016, 06:57
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Aug 10 2016, 09:37) *
Каким образом при помощи watchpoint (или каких-то других сервисов) обнаружить факт выхода SP за границы стека текущей задачи (и записи по SP) в такой ситуации?
При условии что в памяти расположенной ниже стека текущей задачи, могут находиться другие переменные, запись в которые через другие регистры (не SP) - штатна, и запись через SP из других задач - штатна, и не должна вызывать срабатывания механизма обнаружения переполнения стека.
В качестве доп. условий: работа идёт в многозадачной среде, есть N задач, каждая со своим стеком.

У меня было впечатление, что вы человек достаточно опытный в этих делах. Если не можете сами ответить на эти вопросы - что ж, у меня было неверное впечатление, должно быть.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- jcxz   Обязательный префикс функции.   Aug 3 2016, 08:47
- - ig_z   QUOTE (jcxz @ Aug 3 2016, 11:47) Т.е. - ч...   Aug 3 2016, 08:58
|- - demiurg_spb   Цитата(ig_z @ Aug 3 2016, 11:58) Такое то...   Aug 3 2016, 13:36
- - ViKo   Цитата(jcxz @ Aug 3 2016, 11:47) Думаю до...   Aug 3 2016, 09:08
|- - jcxz   Цитата(ViKo @ Aug 3 2016, 15:08) А в idle...   Aug 3 2016, 10:05
- - ViKo   Да, вроде, ни первое ни второе не помеха хорошему ...   Aug 3 2016, 10:08
|- - jcxz   Цитата(ViKo @ Aug 3 2016, 16:08) Да, врод...   Aug 3 2016, 10:23
|- - scifi   Цитата(jcxz @ Aug 3 2016, 13:23) Других с...   Aug 3 2016, 10:44
|- - AlexandrY   Цитата(jcxz @ Aug 3 2016, 13:23) Забитие ...   Aug 3 2016, 10:47
|- - jcxz   Цитата(AlexandrY @ Aug 3 2016, 16:47) J-L...   Aug 3 2016, 11:11
- - k155la3   да простят меня .... переобразовать return в Retu...   Aug 3 2016, 13:16
|- - jcxz   Цитата(k155la3 @ Aug 3 2016, 19:16) да пр...   Aug 3 2016, 15:20
|- - demiurg_spb   Цитата(jcxz @ Aug 3 2016, 18:20) Прошерст...   Aug 3 2016, 16:00
|- - AlexandrY   Цитата(demiurg_spb @ Aug 3 2016, 19:00) В...   Aug 3 2016, 16:11
|- - demiurg_spb   Цитата(AlexandrY @ Aug 3 2016, 19:11) Сде...   Aug 3 2016, 17:01
|- - jcxz   Цитата(AlexandrY @ Aug 3 2016, 22:11) А и...   Aug 3 2016, 18:14
|- - AlexandrY   Цитата(jcxz @ Aug 3 2016, 21:14) Терпимо:...   Aug 3 2016, 19:46
|- - jcxz   Цитата(AlexandrY @ Aug 4 2016, 01:46) Т.е...   Aug 4 2016, 02:58
|- - AlexandrY   Цитата(jcxz @ Aug 8 2016, 14:24) Идея про...   Aug 8 2016, 12:47
||- - jcxz   Цитата(AlexandrY @ Aug 8 2016, 18:47) Это...   Aug 9 2016, 10:55
|- - scifi   Цитата(jcxz @ Aug 9 2016, 14:42) А каким ...   Aug 9 2016, 11:49
||- - demiurg_spb   Цитата(scifi @ Aug 10 2016, 09:57) Коллег...   Aug 10 2016, 09:07
||- - zltigo   QUOTE (scifi @ Aug 10 2016, 09:57) У меня...   Aug 10 2016, 09:41
|||- - scifi   Цитата(zltigo @ Aug 10 2016, 12:41) Ну Вы...   Aug 10 2016, 09:50
||- - jcxz   Цитата(scifi @ Aug 10 2016, 12:57) У меня...   Aug 10 2016, 10:07
||- - scifi   Цитата(jcxz @ Aug 10 2016, 13:07) Вообще-...   Aug 10 2016, 10:12
|- - AlexandrY   Цитата(jcxz @ Aug 10 2016, 09:37) Мне каж...   Aug 10 2016, 09:22
|- - jcxz   Цитата(AlexandrY @ Aug 10 2016, 15:22) Си...   Aug 10 2016, 10:34
|- - scifi   Цитата(jcxz @ Aug 10 2016, 13:34) И нет в...   Aug 10 2016, 11:10
||- - jcxz   Цитата(scifi @ Aug 10 2016, 17:10) О госп...   Aug 10 2016, 11:43
||- - AlexandrY   Цитата(jcxz @ Aug 10 2016, 14:43) Не вижу...   Aug 10 2016, 11:48
|||- - jcxz   Цитата(AlexandrY @ Aug 10 2016, 17:48) Пр...   Aug 10 2016, 11:52
|||- - AlexandrY   Цитата(jcxz @ Aug 10 2016, 14:52) Я так и...   Aug 10 2016, 12:10
|||- - jcxz   Цитата(AlexandrY @ Aug 10 2016, 18:10) Ну...   Aug 10 2016, 12:25
||- - scifi   Цитата(jcxz @ Aug 10 2016, 14:43) Хорошо....   Aug 10 2016, 20:06
||- - jcxz   Цитата(scifi @ Aug 11 2016, 02:06) Пока я...   Aug 11 2016, 01:58
||- - AlexandrY   Цитата(jcxz @ Aug 11 2016, 04:58) И причи...   Aug 11 2016, 06:30
||- - jcxz   Цитата(AlexandrY @ Aug 11 2016, 12:30) 70...   Aug 11 2016, 08:23
||- - AlexandrY   Цитата(jcxz @ Aug 11 2016, 11:23) Только ...   Aug 11 2016, 09:15
||- - jcxz   Цитата(AlexandrY @ Aug 11 2016, 15:15) Ви...   Aug 12 2016, 03:35
|- - AlexandrY   Цитата(jcxz @ Aug 10 2016, 13:34) А её пр...   Aug 10 2016, 11:42
|- - zltigo   QUOTE (jcxz @ Aug 10 2016, 13:34) char b[...   Aug 10 2016, 12:53
|- - jcxz   Цитата(zltigo @ Aug 10 2016, 18:53) Из ли...   Aug 10 2016, 13:44
- - ViKo   В Кейловской РТОС можно включить контроль переполн...   Aug 12 2016, 05:25
- - Kabdim   Может попробовать использовать MPU? Расставить за ...   Aug 12 2016, 07:54
- - AlexandrY   Цитата(Kabdim @ Aug 12 2016, 10:54) Может...   Aug 12 2016, 08:08
- - jcxz   Цитата(Kabdim @ Aug 12 2016, 13:54) Может...   Aug 12 2016, 08:48
- - ViKo   Цитата(jcxz @ Aug 12 2016, 11:48) Как это...   Aug 12 2016, 09:31
|- - jcxz   Цитата(ViKo @ Aug 12 2016, 15:31) Нет. Та...   Aug 12 2016, 09:45
|- - scifi   Цитата(jcxz @ Aug 12 2016, 12:45) хм... с...   Aug 12 2016, 09:59
|- - zltigo   QUOTE (scifi @ Aug 12 2016, 12:59) Мануал...   Aug 12 2016, 10:47
- - AlexandrY   Цитата(jcxz @ Aug 12 2016, 11:48) Ну-ну п...   Aug 12 2016, 13:36
- - jcxz   Цитата(AlexandrY @ Aug 12 2016, 19:36) А ...   Aug 13 2016, 08:16
- - zltigo   QUOTE (jcxz @ Aug 13 2016, 11:16) В динам...   Aug 13 2016, 20:09


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01674 секунд с 7
ELECTRONIX ©2004-2016