Высвобождение DLL из памяти

ActiveX, .NET, DLL
Ответить
Privetvsem
beginner
beginner
Сообщения: 24
Зарегистрирован: 22 янв 2013, 17:14
Репутация: 0
Версия LabVIEW: 2009, 2015
Контактная информация:

Высвобождение DLL из памяти

Сообщение Privetvsem »

Проблема воспроизводится следующим обоазом:
1) Запускаю VI, вызывающий SubVI, содержащий dll'ку
2) Закрываю VI, после его выполнения (причем выполнение произошло без ошибок)
3) Повторяю пункт 1) и получаю ошибку вызова той dll'ки 1097
4) Ошибка пропадает если полностью закрыть LabVIEW, запустить его обратно и запустить VI.
В чем проблема? Почему dll'ка не освобождается после завершения выполнения?

Blackman

Activity
leader
leader
Сообщения: 929
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Репутация: 0
Версия LabVIEW: 6.1,8.5,20
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Blackman »

Есть описание ошибки? Что то у меня не находит такого кода(. А также свойства execution VI и subVI и тип вызова dll (thread).

Artem.spb

Activity Автор
expert
expert
Сообщения: 1936
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Репутация: 0
Версия LabVIEW: 12-18
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Artem.spb »

Blackman писал(а):Есть описание ошибки? Что то у меня не находит такого кода(. А также свойства execution VI и subVI и тип вызова dll (thread).


Possible reason(s):

LabVIEW: An exception occurred within the external code called by a Call Library Function Node. The exception might have corrupted the LabVIEW memory. Save any work to a new location and restart LabVIEW.


Privetvsem писал(а):В чем проблема? Почему dll'ка не освобождается после завершения выполнения?

она и не должна, вдруг ещё понадобится.

Судя по описанию, в самой dll что-то не то с памятью, или не те данные ей передаёте.

По возможности, скиньте код и описание dll
в добавок к этому
Blackman писал(а):. А также свойства execution VI и subVI и тип вызова dll (thread).

Privetvsem
beginner
beginner
Сообщения: 24
Зарегистрирован: 22 янв 2013, 17:14
Репутация: 0
Версия LabVIEW: 2009, 2015
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Privetvsem »

Artem.spb писал(а):
Blackman писал(а):Есть описание ошибки? Что то у меня не находит такого кода(. А также свойства execution VI и subVI и тип вызова dll (thread).


Possible reason(s):

LabVIEW: An exception occurred within the external code called by a Call Library Function Node. The exception might have corrupted the LabVIEW memory. Save any work to a new location and restart LabVIEW.


Privetvsem писал(а):В чем проблема? Почему dll'ка не освобождается после завершения выполнения?

она и не должна, вдруг ещё понадобится.

Судя по описанию, в самой dll что-то не то с памятью, или не те данные ей передаёте.

По возможности, скиньте код и описание dll
в добавок к этому
Blackman писал(а):. А также свойства execution VI и subVI и тип вызова dll (thread).


Сигнатуры методов, вызываемых из дллки полностью совпадают(что и не удивительно, раз при первом запуске все работает). Возможно проблема в типе вызова (c или stdcall). В настройках стоит stdcall. Дллка вызывается в потоке UI. Пишу настройки по памяти, но то что они такие это 100%. Нагуглил тему, где предлагают вызывать subVI динамически по ссылке и потом по завершении работы с ней закрывать ссылку, что высвободит все ее ресурсы. Еще такая фишка VI вызывает несколько разных subVI, вызывающих одну и ту же DLLку. При повторном запуске программы валится исключение при первом вызове одной из них.

Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1069
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Репутация: 0
Версия LabVIEW: 2013-2020
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Kosist »

А с чем работает dll? Я имею ввиду с железом, базой данных, еще каким-то ресурсом? Если она внутри открывает ссылку на ресурс, вполне возможно, что ссылка не закрывается корректно, и при повторной инициализации ресурса (то бишь - вызове этой dll) и возникает ошибка...

У меня была подобная проблема - dll работала с одной кастомной базой данных. И через :labview: вызывались функции, скажем "Read" и "Write". Последовательность "Read" - "Write" работала корректно. Но, когда паралельно вызывались функции "Read", а затем "Write" - запись работала правильно лишь в одном паралельном потоке. Решилось все повторным вызовом функции "Read" для второго, "отстающего" потока. И так и не понятно, в чем проблема - скорее всего, функция "Write" "убивала" все открытые ссылки на базу данных, и все.

А если код в dll, и исходников нету - остается только гадать; как и в Вашем случае.
Мы делили апельсин - много наших полегло...

Privetvsem
beginner
beginner
Сообщения: 24
Зарегистрирован: 22 янв 2013, 17:14
Репутация: 0
Версия LabVIEW: 2009, 2015
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Privetvsem »

Kosist писал(а):А с чем работает dll? Я имею ввиду с железом, базой данных, еще каким-то ресурсом? Если она внутри открывает ссылку на ресурс, вполне возможно, что ссылка не закрывается корректно, и при повторной инициализации ресурса (то бишь - вызове этой dll) и возникает ошибка...

У меня была подобная проблема - dll работала с одной кастомной базой данных. И через :labview: вызывались функции, скажем "Read" и "Write". Последовательность "Read" - "Write" работала корректно. Но, когда паралельно вызывались функции "Read", а затем "Write" - запись работала правильно лишь в одном паралельном потоке. Решилось все повторным вызовом функции "Read" для второго, "отстающего" потока. И так и не понятно, в чем проблема - скорее всего, функция "Write" "убивала" все открытые ссылки на базу данных, и все.

А если код в dll, и исходников нету - остается только гадать; как и в Вашем случае.
Исходный код есть...Но там черт ногу сломит. Дллка работает с ком портом, отправляя по нему команды одной штуке. Почему я не использую готовый функционал из LabVIEW? Потому что в дллке зашита логика формирования формата команды. Я думал, что может проблема в том, что не закрывается дескриптор порта, но он закрывается, когда я вызываю соответствующий метод из длл.

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1921
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Репутация: 0
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов

Re: Высвобождение DLL из памяти

Сообщение Borjomy_1 »

Исходный код есть...Но там черт ногу сломит.

Весь код не нужен. Только вызов dll

Privetvsem
beginner
beginner
Сообщения: 24
Зарегистрирован: 22 янв 2013, 17:14
Репутация: 0
Версия LabVIEW: 2009, 2015
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Privetvsem »

Вот одна из VI плюс код того, что собирается в дллку
Вложения
1.png
2.png
StandInterface.cpp
(3.21 КБ) 118 скачиваний

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1921
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Репутация: 0
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов

Re: Высвобождение DLL из памяти

Сообщение Borjomy_1 »

Кстати, не советую использовать функцию "Error Cluster From Error Code" в таком применении. Просто сделайте соответствующую константу. Сейчас простая ошибка выливается в такое количество действий, при этом вызывается она ВСЕГДА, независимо от того, была на самом деле ошибка или нет... Вы откройте эту функцию и сами увидите, сколько там накручено.

Blackman

Activity
leader
leader
Сообщения: 929
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Репутация: 0
Версия LabVIEW: 6.1,8.5,20
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Blackman »

Проблема воспроизводится следующим обоазом:
1) Запускаю VI, вызывающий SubVI, содержащий dll'ку
2) Закрываю VI, после его выполнения (причем выполнение произошло без ошибок)

После этого проверьте в MAX, есть ли доступ к порту с которым работала DLL.

Privetvsem
beginner
beginner
Сообщения: 24
Зарегистрирован: 22 янв 2013, 17:14
Репутация: 0
Версия LabVIEW: 2009, 2015
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Privetvsem »

Blackman писал(а):
Проблема воспроизводится следующим обоазом:
1) Запускаю VI, вызывающий SubVI, содержащий dll'ку
2) Закрываю VI, после его выполнения (причем выполнение произошло без ошибок)

После этого проверьте в MAX, есть ли доступ к порту с которым работала DLL.

Да вроде все в порядке. Как я уже писал дескриптор порта закрывается после выполнения.

Blackman

Activity
leader
leader
Сообщения: 929
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Репутация: 0
Версия LabVIEW: 6.1,8.5,20
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Blackman »

Было бы значительно проще, если бы Вы сообщили название вышей "пусковой установки")
А так можно посоветовать просканировать порт на предмет различий в обмене для двух сессий.
Судя по названию ошибки можно предположить, что она возникает на этапе идентификации девайса или ожидания какого-то подтверждения, типа ошибки таймаута в VISA.

Privetvsem
beginner
beginner
Сообщения: 24
Зарегистрирован: 22 янв 2013, 17:14
Репутация: 0
Версия LabVIEW: 2009, 2015
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Privetvsem »

Blackman писал(а):Было бы значительно проще, если бы Вы сообщили название вышей "пусковой установки")
А так можно посоветовать просканировать порт на предмет различий в обмене для двух сессий.
Судя по названию ошибки можно предположить, что она возникает на этапе идентификации девайса или ожидания какого-то подтверждения, типа ошибки таймаута в VISA.

Эта штука - самопал, которому я даже не знаю сколько лет) Я нагуглил точно такую же проблему, но ее решение там не дали. Буду сам методом тыка отсекать неверные решения...

Blackman

Activity
leader
leader
Сообщения: 929
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Репутация: 0
Версия LabVIEW: 6.1,8.5,20
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Blackman »

Есть ли хоть какое-то описание протокола обмена? Можете выложить StandCtrl.h файл? Названия всех VI в драйвере. А лучше всего сам драйвер для попытки реверса и переноса кода в VISA.

Privetvsem
beginner
beginner
Сообщения: 24
Зарегистрирован: 22 янв 2013, 17:14
Репутация: 0
Версия LabVIEW: 2009, 2015
Контактная информация:

Re: Высвобождение DLL из памяти

Сообщение Privetvsem »

Проблема решилась отладкой дллки. Ошибка была в коде самой дллки.

Ответить

Вернуться в «Коммуникация с приложениями»