Некорректная работа компоненты с памятью
Всем привет
Занимаемся разработкой внешней компоненты на C++. При тестировании наткнулись на ошибку, которую сообщает платформа: "Некорректная работа компоненты с памятью" и кнопки "Завершить" и "Перезапустить". И это вся ошибка. Попытались собрать какую-то информацию из журнала регистрации (там эта же ошибка) и технологического журнала, однако никакой информации там нет. Ошибка есть только в клиент-серверной базе, при этом не каждый раз, если:
1. Обратиться к компоненте через фоновое задание, и через текущий сеанс.
2. Обратиться к компоненте через два разных сеанса.
Возникшие вопросы:
1. Как можно понять причину ошибки? Т.е. понятно, что есть какая-то ошибка в компоненте, однако 1С не даёт никакой информации, чтобы понять причину хотя бы примерно.
2. Какой серверный процесс выполняет обращение к внешней компоненте? С помощью Visual Studio мы присоединились к процессам 1С (rphost, rpmng и т.д.), чтобы упасть в отладку внешней компоненты, т.к. была вероятность, что может IDE подскажет причину ошибки. Однако в отладку так и не упало, даже не показывалась DLL, что она загружена каким-либо процессом.
Исходные данные:
Windows 11 Pro x64
Платформа 1С 8.3.18.1957
Конфигурация в режиме совместимости 8.3.14
MSSQL 2019
Занимаемся разработкой внешней компоненты на C++. При тестировании наткнулись на ошибку, которую сообщает платформа: "Некорректная работа компоненты с памятью" и кнопки "Завершить" и "Перезапустить". И это вся ошибка. Попытались собрать какую-то информацию из журнала регистрации (там эта же ошибка) и технологического журнала, однако никакой информации там нет. Ошибка есть только в клиент-серверной базе, при этом не каждый раз, если:
1. Обратиться к компоненте через фоновое задание, и через текущий сеанс.
2. Обратиться к компоненте через два разных сеанса.
Возникшие вопросы:
1. Как можно понять причину ошибки? Т.е. понятно, что есть какая-то ошибка в компоненте, однако 1С не даёт никакой информации, чтобы понять причину хотя бы примерно.
2. Какой серверный процесс выполняет обращение к внешней компоненте? С помощью Visual Studio мы присоединились к процессам 1С (rphost, rpmng и т.д.), чтобы упасть в отладку внешней компоненты, т.к. была вероятность, что может IDE подскажет причину ошибки. Однако в отладку так и не упало, даже не показывалась DLL, что она загружена каким-либо процессом.
Исходные данные:
Windows 11 Pro x64
Платформа 1С 8.3.18.1957
Конфигурация в режиме совместимости 8.3.14
MSSQL 2019
По теме из базы знаний
- ВК NativeAPI на Delphi и FreePascal
- Внешняя компонента (Native) для печати двумерного штрих-кода PDF417
- ЕГАИС от А до Я
- Эффективное управление фоновыми заданиями и коммуникация сеансов сервера с Фоном с помощью Структуры обмена (ноу-хау) + Бонус: Альтернативный вариант через Хранилище настроек
- Универсальный обмен XML (КД 2) + RabbitMQ – простая и комфортная работа вместе
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Если вы надеетесь, что специалист по написанию внешних компонент ответит, то вы очень мало (совсем нет) написали про код компоненты. А если пишете для кого-то другого, то он вряд ли сможет помочь.
Проблема в динамическом выделении памяти - вероятно выделение идет из памяти 1С. Пишите ЛОГ из компоненты (на каждом значимом шаге, можно размер уже полученной памяти).
Проблема в динамическом выделении памяти - вероятно выделение идет из памяти 1С. Пишите ЛОГ из компоненты (на каждом значимом шаге, можно размер уже полученной памяти).
(7) Вы, видимо, читали по диагонали: я не прошу решения ошибки. Я прошу подсказок с помощью чего и как мне найти причину. У меня не падает в отладку и нет информации в ТЖ. Может быть кто-то сталкивался с подобным или знает как где-то скопить логи, кроме написания логов самой компоненты (хотя это "такое"). Я сам прекрасно понимаю, что ошибка где-то в компоненте, но я не знаю, как мне понять, где именно. Вы же сделали вывод, что я даю вам явный текст ошибки, но не хочу пользоваться отладчиком и мозгами.
И что толку от кода и выполняемых функций? Скажу я вам, что компонента соединяет строки, вычисляет число Фибоначчи или отправляет HTTP-запросы - это сильно на что-то повлияет? Окей: это всё падает на методе "Match" при использовании регулярных совпадений
И что толку от кода и выполняемых функций? Скажу я вам, что компонента соединяет строки, вычисляет число Фибоначчи или отправляет HTTP-запросы - это сильно на что-то повлияет? Окей: это всё падает на методе "Match" при использовании регулярных совпадений
(8) Метод "Match" при использовании регулярных совпадений Вы сами реализовывали или используете чужие исходные/объектные модули?
Внешняя компонента ничего не пишет ни в какие журналы 1С.
Ошибка возникает либо во время работы самой компоненты при вызове методов менеджера памяти 1С, либо при попытке 1С получить возвращаемые значения параметров.
Внешняя компонента ничего не пишет ни в какие журналы 1С.
Ошибка возникает либо во время работы самой компоненты при вызове методов менеджера памяти 1С, либо при попытке 1С получить возвращаемые значения параметров.
(6)
Память через менеджер памяти 1С надо выделять для возвращаемых (новых) значений параметров и результатов функций.
Память через менеджер памяти 1С надо освобождать для ненужных (старых) значений входных параметров - например, если метод внешней компоненты в качестве параметра принимает строку, а возвращает NULL (или строку большей длины).
В клиент-серверной архитектуре при вызове внешней компоненты &НаСервере вызов DLL производится процессом rphost, при вызове &НаКлиенте вызов DLL производится процессом 1cv8c.exe. В версиях платформы начиная с 8.3.20 появился вариант запуска внешней компоненты в изолированном режиме. В этом случае как на клиенте, так и на сервере создается экземпляр процесса addnhost, который производит вызов DLL.
У меня отладчик MS Visual Studio всегда подключается (и гарантированно останавливается в точках останова) при выполнении внешней компоненты в толстом клиенте/обычном (не управляемом) приложении. В остальных случаях (на сервере, в тонком и веб-клиентах) - не всегда.
Память через менеджер памяти 1С надо выделять для возвращаемых (новых) значений параметров и результатов функций.
Память через менеджер памяти 1С надо освобождать для ненужных (старых) значений входных параметров - например, если метод внешней компоненты в качестве параметра принимает строку, а возвращает NULL (или строку большей длины).
В клиент-серверной архитектуре при вызове внешней компоненты &НаСервере вызов DLL производится процессом rphost, при вызове &НаКлиенте вызов DLL производится процессом 1cv8c.exe. В версиях платформы начиная с 8.3.20 появился вариант запуска внешней компоненты в изолированном режиме. В этом случае как на клиенте, так и на сервере создается экземпляр процесса addnhost, который производит вызов DLL.
У меня отладчик MS Visual Studio всегда подключается (и гарантированно останавливается в точках останова) при выполнении внешней компоненты в толстом клиенте/обычном (не управляемом) приложении. В остальных случаях (на сервере, в тонком и веб-клиентах) - не всегда.
(9)
Это про "возвращение через параметр"? Т.е. входной параметр является результатом функции. Нет, это не используется. Но то, что надо затирать - не знал
Вот как раз у меня не останавливается :с Попробовал через толстый клиент присоединившись к двум процессам-сеансам толстого клиента и к rphost - не упало нигде :с Обычно всегда падает без каких либо проблем. Вот этот момент мне и не понятен - почему не он не падает даже при отладке rphost. При этом в загруженных модулях не видно DLL. Единственное меня немного "смущает", что в подключенных модулях есть загадочная DLL "Dll1.dll", которая загружена и у 1cv8.exe, и rphost.exe
(10) Использую библиотеку boost (уже не помню почему). Верю и знаю, что компонента ничего не будет писать, но платформа же, как мне кажется, как-то должна логировать почему у неё что-то идёт не так. И если платформа это не делает, то непонятно как бы это поймать.
(11) Статических нет. Хотя... может быть тот же boost это использует. А вот это интересный вопрос: когда два сеанса выполняются на сервере (тобишь rphost) и используют одну DLL (тобишь моя компонента) - их сервер не разделяет? Т.е. получается, если два сеанса работают с компонентой от имени rphost и там меняются статические переменные - rphost плевать, что это делают разные сеансы?
Память через менеджер памяти 1С надо освобождать для ненужных (старых) значений входных параметров - например, если метод внешней компоненты в качестве параметра принимает строку, а возвращает NULL (или строку большей длины).
Это про "возвращение через параметр"? Т.е. входной параметр является результатом функции. Нет, это не используется. Но то, что надо затирать - не знал
У меня отладчик MS Visual Studio всегда подключается (и гарантированно останавливается в точках останова) при выполнении внешней компоненты в толстом клиенте/обычном (не управляемом) приложении. В остальных случаях (на сервере, в тонком и веб-клиентах) - не всегда.
Вот как раз у меня не останавливается :с Попробовал через толстый клиент присоединившись к двум процессам-сеансам толстого клиента и к rphost - не упало нигде :с Обычно всегда падает без каких либо проблем. Вот этот момент мне и не понятен - почему не он не падает даже при отладке rphost. При этом в загруженных модулях не видно DLL. Единственное меня немного "смущает", что в подключенных модулях есть загадочная DLL "Dll1.dll", которая загружена и у 1cv8.exe, и rphost.exe
(10) Использую библиотеку boost (уже не помню почему). Верю и знаю, что компонента ничего не будет писать, но платформа же, как мне кажется, как-то должна логировать почему у неё что-то идёт не так. И если платформа это не делает, то непонятно как бы это поймать.
(11) Статических нет. Хотя... может быть тот же boost это использует. А вот это интересный вопрос: когда два сеанса выполняются на сервере (тобишь rphost) и используют одну DLL (тобишь моя компонента) - их сервер не разделяет? Т.е. получается, если два сеанса работают с компонентой от имени rphost и там меняются статические переменные - rphost плевать, что это делают разные сеансы?
(12)
В 1С NativeAPI нет разделения на входные и выходные параметры процедуры/функции. В любом из параметров 1С может передать в компоненту какое-то значение и в любом же из параметров внешняя компонента может возвратить в 1С значение. Вот в результате функции - значение можно только возвращать из компоненты в 1С. Освобождать память надо только в том случае, если полученной из 1С области памяти не хватает для возврата параметра и приходится под него выделять память уже в компоненте.
У толстого клиента обычного(не управляемого) приложения в Windows работает только один процесс.
Платформе хватает своих собственных ошибок и исключений для логирования. В руководстве по разработке внешних компонент явно сказано, что все возможные исключения должны обрабатываться в самой компоненте и в платформу не выбрасываться. Ну выдаст Вам 1С что-то вроде: "Память по адресу 0x00000000 не может быть read" - Вам от этого понятнее станет место ошибки?
Внешняя компонента (dll) подгружается в rphost в единственном экземпляре. Серверные вызовы разных сеансов 1С параллельно выполняются в rphost в разных потоках (threads). Код самого rphost позволяет параллельную работу нескольких потоков. За внутреннее устройство и поведение внешних компонент, не являющихся разработками 1С, фирма никакой ответственности не несет (даже в случае, когда из-за ошибки во компоненте аварийно завершается системный процесс rphost и все пользовательские сеансы, которые он обрабатывал)...
В 1С NativeAPI нет разделения на входные и выходные параметры процедуры/функции. В любом из параметров 1С может передать в компоненту какое-то значение и в любом же из параметров внешняя компонента может возвратить в 1С значение. Вот в результате функции - значение можно только возвращать из компоненты в 1С. Освобождать память надо только в том случае, если полученной из 1С области памяти не хватает для возврата параметра и приходится под него выделять память уже в компоненте.
У толстого клиента обычного(не управляемого) приложения в Windows работает только один процесс.
Платформе хватает своих собственных ошибок и исключений для логирования. В руководстве по разработке внешних компонент явно сказано, что все возможные исключения должны обрабатываться в самой компоненте и в платформу не выбрасываться. Ну выдаст Вам 1С что-то вроде: "Память по адресу 0x00000000 не может быть read" - Вам от этого понятнее станет место ошибки?
Внешняя компонента (dll) подгружается в rphost в единственном экземпляре. Серверные вызовы разных сеансов 1С параллельно выполняются в rphost в разных потоках (threads). Код самого rphost позволяет параллельную работу нескольких потоков. За внутреннее устройство и поведение внешних компонент, не являющихся разработками 1С, фирма никакой ответственности не несет (даже в случае, когда из-за ошибки во компоненте аварийно завершается системный процесс rphost и все пользовательские сеансы, которые он обрабатывал)...
(3) Есть статически выделяемая память. Она выделяется при загрузки DLL (для статических переменных и программного кода). Динамически выделяемая память (выделяемая дополнительно в ходе работы компоненты) выделяется из памяти 1С и должна очищаться после использования.
Про стек, в выше приведенной ссылке, написано про возвращаемые в 1С значения (если они не будут убираться в СТЕК, то в СТЕК кладется ССЫЛКА на память полученную от 1С менеджера памяти). Все функции возвращают результат через СТЕК и получают аргументы тоже через СТЕК (на это повлиять ни как нельзя).
Про стек, в выше приведенной ссылке, написано про возвращаемые в 1С значения (если они не будут убираться в СТЕК, то в СТЕК кладется ССЫЛКА на память полученную от 1С менеджера памяти). Все функции возвращают результат через СТЕК и получают аргументы тоже через СТЕК (на это повлиять ни как нельзя).
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот