Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 AccessViolationException в Unit-тесте  [new]
JeStone
Member

Откуда:
Сообщений: 248
Сложновато будет объяснить, потому что кода много и я не могу его весь в одном посте написать.
В общем есть исключение, которое вываливается ТОЛЬКО в Unit-тесте и ТОЛЬКО в режиме Run. В Debug не вываливается. Не могу понять в чем может быть дело. StackTrace ошибки:
Test Name: ConvertModuleConvertNameTest1
Test FullName: UnitTest.ConvertModuleUnitTests.ConvertModuleConvertNameTest1
Test Source: e:\Projects\Visual Studio Projects\ActivityManager\UnitTest\ConvertModuleUnitTests.cs : line 4104
Test Outcome: Failed
Test Duration: 0:00:00,0993823

Result Message:
Test method UnitTest.ConvertModuleUnitTests.ConvertModuleConvertNameTest1 threw exception:
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Result StackTrace:
at Declensions.Unicode.Declension.decGetFIOPadegFS(IntPtr fio, Int32 sex, Int32 padeg, IntPtr result, Int32& resultLength)
at Declensions.Unicode.Declension.GetSNPDeclension(String surnameNamePatronimic, Gender gender, DeclensionCase declensionCase) in e:\Projects\Visual Studio Projects\ActivityManager\Declension\DeclensionUnicode.cs:line 178
at ConvertModule.ConvertPlug.ConvertNameToCase(String nameIn, String format, TextCase textCase, String& nameOut) in e:\Projects\Visual Studio Projects\ActivityManager\ConvertModule\ConvertPlugin.cs:line 817
at ConvertModule.ConvertPlug.ConvertNameCellToCase(ReportRow inRow, String column, String format, TextCase textCase, ReportRow& outRow) in e:\Projects\Visual Studio Projects\ActivityManager\ConvertModule\ConvertPlugin.cs:line 866
at ConvertModule.ConvertPlug.ConvertNameColToCase(ReportTable inTable, String column, String format, TextCase textCase, ReportTable& outTable) in e:\Projects\Visual Studio Projects\ActivityManager\ConvertModule\ConvertPlugin.cs:line 896
at UnitTest.ConvertModuleUnitTests.ConvertModuleConvertNameTest1() in e:\Projects\Visual Studio Projects\ActivityManager\UnitTest\ConvertModuleUnitTests.cs:line 4106


Код Unit-теста:
        [TestMethod]
        public void ConvertModuleConvertNameTest1()
        {
            ReportTable table = "[{\"id\":\"Азаров Илья Сергеевич\"},{\"id\":\"Алехин Владимир Сергеевич\"},{\"id\":\"Бабайцев Алексей Сергеевич\"},{\"id\":\"Вощечков Александр Александрович\"},{\"id\":\"Гаина Виктор Олегович\"},{\"id\":\"Эльтеков Сергей Валерьевич\"},{\"id\":\"Игнатов Василий Васильевич\"},{\"id\":\"кирпич\"}]";
            ConvertPlug plug = new ConvertPlug();
            plug.ConvertNameColToCase(table, "id", "ss nn pp s n p", TextCase.Genitive, out table);
            Assert.AreEqual(table[0]["id"].Value, "Азарова Ильи Сергеевича А И С");
            Assert.AreEqual(table[1]["id"].Value, "Алехина Владимира Сергеевича А В С");
            Assert.AreEqual(table[2]["id"].Value, "Бабайцева Алексея Сергеевича Б А С");
            Assert.AreEqual(table[3]["id"].Value, "Вощечкова Александра Александровича В А А");
            Assert.AreEqual(table[4]["id"].Value, "Гаины Виктора Олеговича Г В О");
            Assert.AreEqual(table[5]["id"].Value, "Эльтекова Сергея Валерьевича Э С В");
            Assert.AreEqual(table[6]["id"].Value, "Игнатова Василия Васильевича И В В");
            Assert.AreEqual(table[7]["id"].Value, "кирпич");
        }


Код тестового консольного приложения:
         static void Main(string[] args)
        {
            ReportTable table = "[{\"id\":\"Азаров Илья Сергеевич\"},{\"id\":\"Алехин Владимир Сергеевич\"},{\"id\":\"Бабайцев Алексей Сергеевич\"},{\"id\":\"Вощечков Александр Александрович\"},{\"id\":\"Гаина Виктор Олегович\"},{\"id\":\"Эльтеков Сергей Валерьевич\"},{\"id\":\"Игнатов Василий Васильевич\"},{\"id\":\"кирпич\"}]";
            ConvertPlug plug = new ConvertPlug();
            IOPlug ioplug = new IOPlug();
            for (int i = 0; i < 100; i++)  //Цикл тупо для теста
               plug.ConvertNameColToCase(table, "id", "ss nn pp s n p", TextCase.Genitive, out table); //Тут ошибок не происходит, работает все корректно
        }


Как видно из StackTrace исключение в методе decGetFIOPadegFS. Это unmanaged метод из библиотеки PadegUC.dll. Объявляется он так:
        [DllImport("PadegUC.dll", EntryPoint = "GetFIOPadegFS", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        private static extern Int32 decGetFIOPadegFS([In] IntPtr fio, [In] Int32 sex, [In] Int32 padeg, [In, Out] IntPtr result, [In, Out] ref Int32 resultLength);

Вызывается так:
public static string GetSNPDeclension(string surnameNamePatronimic, Gender gender,
                                              DeclensionCase declensionCase)
        {
            if (surnameNamePatronimic == null)
            {
                throw new ArgumentNullException("surnameNamePatronimic");
            }

            CheckGender(gender);
            CheckDeclensionCase(declensionCase);

            IntPtr[] ptrs = null;
            try
            {
                ptrs = StringsToIntPtrArray(surnameNamePatronimic);

                int resultLen = MaxResultBufSize;
                int err = decGetFIOPadegFS(ptrs[0], (Int32)gender, (Int32)declensionCase,
                                           ptrs[1], ref resultLen);
                ThrowException(err);
                return Marshal.PtrToStringUni(ptrs[1]);
            }
            finally
            {
                FreeIntPtr(ptrs);
            }
        }

Консольное приложение работает под .Net 4.5, исключений нет. Есть еще одно приложение работающее под .Net 3.5, исключений нет. Пробовал в Release Mode отключать оптимизацию (галочку Optimize Code), не помогло.

В общем получается так, что код работает (и возвращает корректные данные и не вызывает исключения нигде, кроме Unit-теста в режиме Run, специально проверил), но тест в Run не проходит.
До этого использовалась библиотека Padeg.dll (не юникодовская), тест проходил на ура.
Чем проект Unit-Test принципиально отличается от обычной dll? Почему может так происходить?
24 дек 14, 15:28    [17046601]     Ответить | Цитировать Сообщить модератору
 Re: AccessViolationException в Unit-тесте  [new]
JeStone
Member

Откуда:
Сообщений: 248
в режиме Analize Code Coverage ошибки тоже не возникает никогда.
Установка [MethodImpl(MethodImplOptions.NoOptimization)] не помогла.
Уже все перепробовал, что в голову пришло, на сколько бы бредовым это не было...
24 дек 14, 18:01    [17047832]     Ответить | Цитировать Сообщить модератору
 Re: AccessViolationException в Unit-тесте  [new]
JeStone
Member

Откуда:
Сообщений: 248
Проблема решена
26 дек 14, 04:29    [17054787]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: AccessViolationException в Unit-тесте  [new]
homk
Member

Откуда:
Сообщений: 1
JeStone,

Ты бы хоть написал как, шайтан.
23 июл 19, 18:41    [21933003]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить