Стратегия, происходит перезапись статической переменной
Добавлено: Чт янв 17, 2013 2:05 am
В общем, очень неприятная проблема - из кода Forex Tester происходит перезапись статической переменной, расположенной в DLL-ке стратегии.
Вот первые строчки основного модуля (после директив #include):
bool Init = false;
TStrategy *Strategy1 = NULL;
TStrategy *Strategy = NULL;
int Magic = 0;
Происходит порча перезаписью 32-битным значением 0x1cf80001 по адресу Strategy1 минус 2 байта. При этом Init не портится, так как между ними есть пропуск из-за выравнивания. То есть, портятся два байта до Strategy1, и два байта Strategy1. Пробовал менять имена переменных, вставлял не используемые - результат не меняется. Собственно, раньше там стояла Strategy и происходила беда. Поставил Strategy1 - это не используемая переменная, которая специально стоит на этом месте, принимает беду на себя.
Последовательность действий.
Точки останова стоят на InitStrategy(), DoneStrategy(), ResetStrategy().
1. Запускаем Forex Tester, успеваем подключиться отладчиком до инициализации стратегий и ловим точку останова на InitStrategy() - переменные в порядке (обе NULL). Продолжаем выполнение.
2. В Forex Testere нажимаем Start Test, задать начальную дату, тестировать. Ловим точку останова на ResetStrategy() - память испорчена, Strategy1 = 0x00001cf8.
Если поставить точку останова на данные, попадаем в код Forex Testera. Конкретный пример.
Адрес Init 0x0f208798, адрес Strategy1 0x0f20879c. Ставим точку останова на данные. Попадаем в ForexTester.exe!00625d64():
00625D5C mov edx,dword ptr [ebp-4]
00625D5F mov edx,dword ptr [edx+0Ch]
00625D62 mov dword ptr [edx],eax
00625D64 jmp 00625EA7
Тут edx = 0x0f20879a, eax = 0x1cf80001. Соответственно, 0001 попадает в неиспользуемые байты, а 1cf8 в Strategy1.
Перезапись происходит ДО нажатия на кнопку Start test.
После вставки Strategy1 стратегия стала запускаться, но очень хотелось бы разобраться с этим, так как этими 4-мя байтами дело может не ограничиваться.
Вот первые строчки основного модуля (после директив #include):
bool Init = false;
TStrategy *Strategy1 = NULL;
TStrategy *Strategy = NULL;
int Magic = 0;
Происходит порча перезаписью 32-битным значением 0x1cf80001 по адресу Strategy1 минус 2 байта. При этом Init не портится, так как между ними есть пропуск из-за выравнивания. То есть, портятся два байта до Strategy1, и два байта Strategy1. Пробовал менять имена переменных, вставлял не используемые - результат не меняется. Собственно, раньше там стояла Strategy и происходила беда. Поставил Strategy1 - это не используемая переменная, которая специально стоит на этом месте, принимает беду на себя.
Последовательность действий.
Точки останова стоят на InitStrategy(), DoneStrategy(), ResetStrategy().
1. Запускаем Forex Tester, успеваем подключиться отладчиком до инициализации стратегий и ловим точку останова на InitStrategy() - переменные в порядке (обе NULL). Продолжаем выполнение.
2. В Forex Testere нажимаем Start Test, задать начальную дату, тестировать. Ловим точку останова на ResetStrategy() - память испорчена, Strategy1 = 0x00001cf8.
Если поставить точку останова на данные, попадаем в код Forex Testera. Конкретный пример.
Адрес Init 0x0f208798, адрес Strategy1 0x0f20879c. Ставим точку останова на данные. Попадаем в ForexTester.exe!00625d64():
00625D5C mov edx,dword ptr [ebp-4]
00625D5F mov edx,dword ptr [edx+0Ch]
00625D62 mov dword ptr [edx],eax
00625D64 jmp 00625EA7
Тут edx = 0x0f20879a, eax = 0x1cf80001. Соответственно, 0001 попадает в неиспользуемые байты, а 1cf8 в Strategy1.
Перезапись происходит ДО нажатия на кнопку Start test.
После вставки Strategy1 стратегия стала запускаться, но очень хотелось бы разобраться с этим, так как этими 4-мя байтами дело может не ограничиваться.