Build 206 в дебаг-модусе: terminal.exe вываливается с access violation

 
Здравствуйте,
последовав назойливому диалогу o Live Update я актуализировал Build 205 на Build 206, поставив заново Метатрейдер (апдейт не сработал). После этого стало невозможным работать с советником, который использует внешнюю DLL (VC++ 2005 /noclr) в Debug-модусе. Terminal.exe вываливается с такими ошибками:

'terminal.exe': Loaded 'C:\Programme\MetaTrader 4\terminal.exe', Binary was not built with debug information.
'terminal.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\user32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\Programme\Google\Google Desktop Search\GoogleDesktopNetwork3. dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\ws2_32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\ws2help.dll', No symbols loaded.
'terminal.exe': Unloaded 'C:\Programme\Google\Google Desktop Search\GoogleDesktopNetwork3. dll'
'terminal.exe': Unloaded 'C:\WINDOWS\system32\ws2_32.dll'
'terminal.exe': Unloaded 'C:\WINDOWS\system32\ws2help.dll'
'terminal.exe': Unloaded 'C:\WINDOWS\system32\msvcrt.dll'
'terminal.exe': Unloaded 'C:\WINDOWS\system32\advapi32.dll'
'terminal.exe': Unloaded 'C:\WINDOWS\system32\rpcrt4.dll'
First-chance exception at 0x00bc4279 in terminal.exe: 0xC0000005: Access violation reading location 0x00000000.
'terminal.exe': Loaded 'C:\WINDOWS\system32\ws2_32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\ws2help.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\winmm.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\msimg32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\mfc42.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\mfc42loc.dll', Binary was not built with debug information.
'terminal.exe': Loaded 'C:\WINDOWS\system32\shell32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\shlwapi.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6. 0.2600.2982_x-ww_ac3f9c03\comctl32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\ole32.dll', No symbols loaded.
'terminal.exe': Loaded 'C:\WINDOWS\system32\oleaut32.dll', No symbols loaded.
First-chance exception at 0x7c97df51 in terminal.exe: 0xC0000005: Access violation reading location 0x00fffff8.
First-chance exception at 0x0012ffe0 in terminal.exe: 0xC000001D: Illegal Instruction.
First-chance exception at 0x00ba7586 in terminal.exe: 0xC0000005: Access violation writing location 0x00400fff.
First-chance exception at 0x00000103 in terminal.exe: 0xC0000005: Access violation reading location 0x00000103.
First-chance exception at 0x7c9479d1 in terminal.exe: 0xC0000005: Access violation writing location 0x00030ffc.
... много раз строка выше
The program '[73476] terminal.exe: Native' has exited with code 0 (0x0).

Build 205 работает без проблем.

Как репродуцировать эту ошибку:
(по памяти)

1. Откройте проeкт DllSample в VS 2005, выберите вариант Debug. Скомпилируйте dll.
2. Скопируйте каталоги include и libraries из каталога DllSample в experts.
3. Измените команду запуска Дебагера на C:\Programme\MetaTrader 4\terminal.exe
4. Запустите дебаг.


Всего хорошего

Олексій
 
Терминал не должен работать в режиме отладки и специально падает.
 
Renat:
Терминал не должен работать в режиме отладки и специально падает.
Остается только сожалеть, так как это решение существенно осложняет подключение существующих систем и создание новых внешних экспертов. ..
 

Тоже попробовал запусить в дебаг режиме DLL под Delphi тоже падает ну следующий шаг запрет DLL вовсе.

Не понято почему решили запретить отлаживать внешние DLL.

Предположу что хотят тем самым ещё подтолкнуть разработчиков не писать часть кода в длл а делать это только на MQL

Хотя странно ведь в этом случае сильно усложнается поиск ошибки во внешних длл.

 

Тут и появляется вопрос - ЗАЧЕМ!!!!!

И вообще - как сейчас порекомендуете отлажывать DLL?

 
elritmo:

Не понято почему решили запретить отлаживать внешние DLL.

Предположу что хотят тем самым ещё подтолкнуть разработчиков не писать часть кода в длл а делать это только на MQL

Ответ лежит на поверхности. Мы запрещаем ковыряние в нашем коде даже если кто-то имеет проблемы с отладкой своих DLL.
 
Renat:
elritmo:

Не понято почему решили запретить отлаживать внешние DLL.

Предположу что хотят тем самым ещё подтолкнуть разработчиков не писать часть кода в длл а делать это только на MQL

Ответ лежит на поверхности. Мы запрещаем ковыряние в нашем коде даже если кто-то имеет проблемы с отладкой своих DLL.


Renat - извините, но это ПАРАНОЯ!

Разве не понимаете, что професионал всегда найдет способа "ковырятся в вашем коде"? Сколько человек "ковыряются" и сколько пытаются сделать что-то через DLL? Разве нелзя разрешить дебаг после вызова потребительской функции и обратно запретить его по возвращения?

 

Я тоже подумал что это праноя. Я в хакерских делах не шарю но вообще то как можно отлаживать чужой код не имея исходников к нему?

Если только в айс да и то им я слышал пользуются только чтобы взломать защиту продука, а МТ4 свободно распростаняемый продукт так что не вижу опасений.

Ну чтож хакеры будут копатся в билде 205 который не сильно отличается от новых версий терминала ;о)

Но этот факт меня весьма растроил. Теперь думаю а что будет следующим шагом компании. Надеюсь компании не запретит вызов функций DLL из соображений "безопасности" :(

Неужели в компанию дошла информация что кто то как то отлаживет код terminal.exe по шагам? Или это догадки и перестраховка?

Ну чтож выход остаётся написать в длл только мостик который будет обмениваться информацией между мт4 и с собственным исполняемым exe файлом который по шагам отлаживать не будет проблем. А этот "мостик" можно отладит в 205 версии которая не запрещает отладку.

 
Чтобы понять мотивы, нужно встать на другую (вторую, третью, десятую) сторону и подумать. Иначе вот так вот и получается непонимание чужих действий (на основе суждений со своей колокольни) и придумываются небылицы.

С одной стороны, трейдеры требуют - "защищайте наш EX4 код", а с другой стороны "почему нельзя легко отлаживать свои DLL?".
Мы защищаем свой терминал и код экспертов даже если это приводит к проблемам отладки DLL.
 

Renat, неужели уже не поняли, что в ваш бизнес модель действует не так, как вы когда-то думали.

Вы априори предполагаете, что мы, програмисты будем делать какие-то советники и будем пытатся их продавать. Тут уже все понятно - есть мелький продавец, тот продает свой труд для каких-то $20, $30, ну - допустим $100. Вот такой человек можеть быть безсовестный хакер и сделать из советника какого-то трояна. Вот и поэтому вы пытаетесь защитить мелкого покупателя от плохого хакера. Как? MQL4 должен быть безопасным. Все должно быть в песочнице. Покупатель должен иметь возможность отключить DLL (кажется - по умолчанием DLL-ы запрещены?), отключать отсылка писем и FTP. И т.д. - все это понятно. API - източник проблемов - тогда и не будеть API. Действительно, MT3-API было слишком незащищен. Сетевые запросы шли директно с вашего DLL-a и хакерам можно было взломать сервер брокера - а это действительно проблема. НО - если запросы идут не директно, а через терминал, то тогда API было бы так защищено, как и сам терминал. Кроме того - если вы оформили бы API как ActiveX, то тогда можно было использовать любого языка, причем реализация была бы намного легче (писать компилятор - очен сложно, даже сейчас находим ужасные баги - см. 'StrToTime() - что возвращает, если даты такой не существует?')

Пример удачного API: - http://deltastock.com (так как этот брокер не изпользует MT вообще, будем считать это не обсуждение брокеров) Правда, там еще не поняли, что нужен тестер, а потом поймут, что нужен оптимизатор, а потом прийдет время и для генетического оптимизатора, но все это - только вопрос времени.

Вы кажется не понимаете, что это мышление типа homo sovieticus (мне, как "не советского" человека, хотя и советского инженера это ой как хорошо видно!). Между продавца и покупателя существует какое-то доверия. Вот я читал лицензионное споразумение на терминала. И что я вижу? Вы не несете НИКАКОЙ ответственности, если напр. терминал испортить остальной софт или хард. Но я вам ВЕРЮ! Поэтому изпользую MT4. A вы оказывается считаете всех нас неблагонадежными типажами - хакерами.

На самом деле советники, стоящие $20-$100 - хлам. Кот в мешке. Печатный станок не стоит $100. Я это понимаю, инвеститоры это понимают. Поэтому удачные экспертописателей либо пишут на заказ, либо пишут для себя. И им никакая защита для EX4 не нужна. Просто посмотрите кто требует "защищайте наш EX4 код", и вообще - как идут дела у "самотных экспертописателей"

Renat, я понимаю, что вы ОЧЕНЬ упрямый человек - иначе ваша компания не была бы такая успешная, но можеть быть стоит задуматься?

 

Что то мне не понятно как можно вскрять код если в эксперте есть вызовы из длл? Ну допустим хакер подставит свою длл и поймает вызов и по шагам сможет пройтись по исходному коду своей длл но а дальше то как? Исходников ни терминала ни эксперта нет. Или что ассемблерные команды будут анализировать? Так думаю ваша защита которую вы сделали не защищает от такого рода отладки - если конечно она кому то нужна. Я думаю код терминала даже с исходниками непосвященному будет сложно разобрать неговоря уж разбирать логику по ассемблерным командам (цена продукта не столь высока чтобы заниматься таким гемороем :)). Так бы уже давно бы вскрули логику всех сущесвующих комерческих продуктов где есть вызовы длл. Но никто этим не занимается. Единсвенное что делают это снимают защиту от копирования и просто кий генераторы делают. Но раз компания решила таким простым способом защитится от фантомной опасности то нам разработчикам стоит смирится - нас же считает компания малочисленной популяцией - все пишут на MQL4 только. А все кто разрабоатывает свои системы вне мт4 и использует терминал для отдачи приказов и может быть вывода граф объектов или делают сложные расчёты написанные в нейтивном коде - это малочисленная кагорта, которая смирится с отсутсвием отладки, но зато будут морально удовлетворены те, кто теперь будет считать что их mq4 код защищён. Интересно как они могут быть в этом уверены теперь что их код не вскроют?

Кстати здесь уже сказали а нельзя ли блокировать отладку когда идёт возврат из функций DLL но разрешать её только для DLL или это сложно реализовать?