Что это за crash

 

Решил я переписать один индикатор с mql4 в mql5 и вот получаю такой crash

2019.03.11 13:27:30.396 00 (AUDCAD,M15) Access violation at 0x0000000003C5181C read to 0x0000000000000004 in 'D:\MetaTrader 5\Hadge MT5\MQL5\Indicators\00.ex5'
2019.03.11 13:27:30.396 00 (AUDCAD,M15)    crash -->  0000000003C5181C 488B142504000000  mov        rdx, [0x4]
2019.03.11 13:27:30.396 00 (AUDCAD,M15)               0000000003C51824 4885D2            test       rdx, rdx
2019.03.11 13:27:30.396 00 (AUDCAD,M15)               0000000003C51827 7421              jz         0x3c5184a
2019.03.11 13:27:30.396 00 (AUDCAD,M15) 
2019.03.11 13:27:30.396 00 (AUDCAD,M15)               0000000003C51829 4883C2F4          add        rdx, 0xf4
2019.03.11 13:27:30.396 00 (AUDCAD,M15)               0000000003C5182D 741B              jz         0x3c5184a
2019.03.11 13:27:30.396 00 (AUDCAD,M15) 
2019.03.11 13:27:30.396 00 (AUDCAD,M15)               0000000003C5182F FF4A04            dec        dword [rdx+0x4]
2019.03.11 13:27:30.396 00 (AUDCAD,M15)               0000000003C51832 7516              jnz        0x3c5184a
2019.03.11 13:27:30.396 00 (AUDCAD,M15) 
2019.03.11 13:27:30.396 00 (AUDCAD,M15) 
2019.03.11 13:27:30.396 00 (AUDCAD,M15) 00: 0x0000000003C5181C
2019.03.11 13:27:30.396 00 (AUDCAD,M15) 

Системная информация

2019.03.11 11:41:13.086 Terminal        MetaTrader 5 x64 build 2007 started (MetaQuotes Software Corp.)
2019.03.11 11:41:13.086 Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 11, AMD FX-4170 Quad-Core Processor , Memory: 9358 / 12255 Mb, Disk: 17 / 238 Gb, GMT+3
2019.03.11 11:41:13.086 Terminal        D:\MetaTrader 5\Hadge MT5
 
Я так понимаю Вы dll использовали, иначе к адресу 0х4 не получится обратиться. Скорее всего в dll передана неинициализированная ссылка на класс, и была попытка обращения к полю. Если первое поле int, то как раз обращение ко второму и было бы 0х4, а дальше уже ОС Вас откинула. Вам еще повезло, Если бы у Вас в поле был статический массив, например long[1000] и Вы обратились бы сразу к [999], то Вы бы залезли в разрешенную область памяти и "испортили" бы ее.
 
Vladimir Simakov:
Я так понимаю Вы dll использовали, иначе к адресу 0х4 не получится обратиться. Скорее всего в dll передана неинициализированная ссылка на класс, и была попытка обращения к полю. Если первое поле int, то как раз обращение и пошло к 0х4, а дальше уже ОС Вас откинула. Вам еще повезло, Если бы у Вас в поле был статический массив, например long[1000] и Вы обратились бы сразу к [999], то Вы бы залезли в разрешенную область память и "испортили" бы ее.

Нет. DLL и в версии mql4 небыло.

 
Alexey Viktorov:

Нет. DLL и в версии mql4 небыло.

 mov        rdx, [0x4]

Означает поместить в регистр rdx данные хранящиеся по адресу 0x4 в памяти/

 
В любом случае, у Вас попытка разыменования нулевого указателя
 
Vladimir Simakov:

Означает поместить в регистр rdx данные хранящиеся по адресу 0x4 в памяти/

Я-же не спорю. Просто констатирую факт, что dll не используется. А средствами mql даже если и есть возможность выполнить это, то не с моими знаниями.

 
Alexey Viktorov:

Я-же не спорю. Просто констатирую факт, что dll не используется. А средствами mql даже если и есть возможность выполнить это, то не с моими знаниями.

Ищите в коде кусок с такой логикой

if (class.a==0) return;

class.a+=(long) b;

if (class.a!=0) --class.a;

return;

Скорее всего это метод класса, который вы не инициализировали.

 
Vladimir Simakov:

Ищите в коде кусок с такой логикой

if (class.a==0) return;

class.a+=(long) b;

if (class.a!=0) --class.a;

return;

Скорее всего это метод класса, который вы не инициализировали.

Владимир, ну нету в коде даже обращения к классу. Это чужой индикатор, иначе я выложил-бы код здесь. Что странно в дебагере на текущих данных проходит пошагово весь код. А на исторических данных до OnInit() не доходит, висит. Если кинуть на график, вот такой crash сыпет.

 
Alexey Viktorov:

Владимир, ну нету в коде даже обращения к классу. Это чужой индикатор, иначе я выложил-бы код здесь. Что странно в дебагере на текущих данных проходит пошагово весь код. А на исторических данных до OnInit() не доходит, висит. Если кинуть на график, вот такой crash сыпет.

А mql4 с #property strict или без него?
 
А в OnInit() он хотя бы заходит?
 

MQL4 с #property strict

При запуске дебагера на исторических данных в OnInit() не заходит. Первой строкой стоит преобразование input времени в тип datetime и на этой строке поставлена точка останова. Но в OnInit() не входит.