Некорректная работа компоненты с памятью

1. Treaqq 09.01.25 14:21 Сейчас в теме
Всем привет

Занимаемся разработкой внешней компоненты на 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
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. MissionOnly 3 09.01.25 14:45 Сейчас в теме
(1) Если вы надеетесь, что специалист по написанию внешних компонент ответит, то вы очень мало (совсем нет) написали про код компоненты. А если пишете для кого-то другого, то он вряд ли сможет помочь.

Проблема в динамическом выделении памяти - вероятно выделение идет из памяти 1С. Пишите ЛОГ из компоненты (на каждом значимом шаге, можно размер уже полученной памяти).
6. Treaqq 10.01.25 07:18 Сейчас в теме
(2) Везде память выделяется через менеджер памяти 1С. Если бы в этом была проблема, то проблема бы возникала и в файловой базе, и в одном сеансе. Т.е. реально была бы утечка. Но проблема именно в клиент-серверном варианте и в разных сеансах
7. MissionOnly 3 10.01.25 08:58 Сейчас в теме
(6) Ну тогда обычно описывают функции выполняемые компонентой, или ждем Кошпировского.
8. Treaqq 11.01.25 10:03 Сейчас в теме
(7) Вы, видимо, читали по диагонали: я не прошу решения ошибки. Я прошу подсказок с помощью чего и как мне найти причину. У меня не падает в отладку и нет информации в ТЖ. Может быть кто-то сталкивался с подобным или знает как где-то скопить логи, кроме написания логов самой компоненты (хотя это "такое"). Я сам прекрасно понимаю, что ошибка где-то в компоненте, но я не знаю, как мне понять, где именно. Вы же сделали вывод, что я даю вам явный текст ошибки, но не хочу пользоваться отладчиком и мозгами.

И что толку от кода и выполняемых функций? Скажу я вам, что компонента соединяет строки, вычисляет число Фибоначчи или отправляет HTTP-запросы - это сильно на что-то повлияет? Окей: это всё падает на методе "Match" при использовании регулярных совпадений
10. gml 11.01.25 20:26 Сейчас в теме
(8) Метод "Match" при использовании регулярных совпадений Вы сами реализовывали или используете чужие исходные/объектные модули?

Внешняя компонента ничего не пишет ни в какие журналы 1С.

Ошибка возникает либо во время работы самой компоненты при вызове методов менеджера памяти 1С, либо при попытке 1С получить возвращаемые значения параметров.
9. gml 11.01.25 20:18 Сейчас в теме
(6)
Память через менеджер памяти 1С надо выделять для возвращаемых (новых) значений параметров и результатов функций.
Память через менеджер памяти 1С надо освобождать для ненужных (старых) значений входных параметров - например, если метод внешней компоненты в качестве параметра принимает строку, а возвращает NULL (или строку большей длины).

В клиент-серверной архитектуре при вызове внешней компоненты &НаСервере вызов DLL производится процессом rphost, при вызове &НаКлиенте вызов DLL производится процессом 1cv8c.exe. В версиях платформы начиная с 8.3.20 появился вариант запуска внешней компоненты в изолированном режиме. В этом случае как на клиенте, так и на сервере создается экземпляр процесса addnhost, который производит вызов DLL.

У меня отладчик MS Visual Studio всегда подключается (и гарантированно останавливается в точках останова) при выполнении внешней компоненты в толстом клиенте/обычном (не управляемом) приложении. В остальных случаях (на сервере, в тонком и веб-клиентах) - не всегда.
11. gml 11.01.25 20:32 Сейчас в теме
(6)
Нет ли в Вашей программе статических (static) переменных? При одновременной работе в нескольких сеансах 1С серверные вызовы могут выполняться параллельно в разных тредах одного и того же процесса rphost и перетирать статические переменные.
12. Treaqq 11.01.25 21:10 Сейчас в теме
(9)
Память через менеджер памяти 1С надо освобождать для ненужных (старых) значений входных параметров - например, если метод внешней компоненты в качестве параметра принимает строку, а возвращает NULL (или строку большей длины).

Это про "возвращение через параметр"? Т.е. входной параметр является результатом функции. Нет, это не используется. Но то, что надо затирать - не знал

У меня отладчик MS Visual Studio всегда подключается (и гарантированно останавливается в точках останова) при выполнении внешней компоненты в толстом клиенте/обычном (не управляемом) приложении. В остальных случаях (на сервере, в тонком и веб-клиентах) - не всегда.

Вот как раз у меня не останавливается :с Попробовал через толстый клиент присоединившись к двум процессам-сеансам толстого клиента и к rphost - не упало нигде :с Обычно всегда падает без каких либо проблем. Вот этот момент мне и не понятен - почему не он не падает даже при отладке rphost. При этом в загруженных модулях не видно DLL. Единственное меня немного "смущает", что в подключенных модулях есть загадочная DLL "Dll1.dll", которая загружена и у 1cv8.exe, и rphost.exe

(10) Использую библиотеку boost (уже не помню почему). Верю и знаю, что компонента ничего не будет писать, но платформа же, как мне кажется, как-то должна логировать почему у неё что-то идёт не так. И если платформа это не делает, то непонятно как бы это поймать.

(11) Статических нет. Хотя... может быть тот же boost это использует. А вот это интересный вопрос: когда два сеанса выполняются на сервере (тобишь rphost) и используют одну DLL (тобишь моя компонента) - их сервер не разделяет? Т.е. получается, если два сеанса работают с компонентой от имени rphost и там меняются статические переменные - rphost плевать, что это делают разные сеансы?
13. gml 11.01.25 21:49 Сейчас в теме
(12)
В 1С NativeAPI нет разделения на входные и выходные параметры процедуры/функции. В любом из параметров 1С может передать в компоненту какое-то значение и в любом же из параметров внешняя компонента может возвратить в 1С значение. Вот в результате функции - значение можно только возвращать из компоненты в 1С. Освобождать память надо только в том случае, если полученной из 1С области памяти не хватает для возврата параметра и приходится под него выделять память уже в компоненте.

У толстого клиента обычного(не управляемого) приложения в Windows работает только один процесс.

Платформе хватает своих собственных ошибок и исключений для логирования. В руководстве по разработке внешних компонент явно сказано, что все возможные исключения должны обрабатываться в самой компоненте и в платформу не выбрасываться. Ну выдаст Вам 1С что-то вроде: "Память по адресу 0x00000000 не может быть read" - Вам от этого понятнее станет место ошибки?

Внешняя компонента (dll) подгружается в rphost в единственном экземпляре. Серверные вызовы разных сеансов 1С параллельно выполняются в rphost в разных потоках (threads). Код самого rphost позволяет параллельную работу нескольких потоков. За внутреннее устройство и поведение внешних компонент, не являющихся разработками 1С, фирма никакой ответственности не несет (даже в случае, когда из-за ошибки во компоненте аварийно завершается системный процесс rphost и все пользовательские сеансы, которые он обрабатывал)...
3. lmnlmn 69 09.01.25 15:01 Сейчас в теме
(1) Дай бог памяти, в компонентах надо память выделять под то что в стек не влазит. Почитать можно тут. Обратить внимание надо на использование менеджера памяти, когда и под какие типы.
4. MissionOnly 3 09.01.25 15:27 Сейчас в теме
(3) Есть статически выделяемая память. Она выделяется при загрузки DLL (для статических переменных и программного кода). Динамически выделяемая память (выделяемая дополнительно в ходе работы компоненты) выделяется из памяти 1С и должна очищаться после использования.

Про стек, в выше приведенной ссылке, написано про возвращаемые в 1С значения (если они не будут убираться в СТЕК, то в СТЕК кладется ССЫЛКА на память полученную от 1С менеджера памяти). Все функции возвращают результат через СТЕК и получают аргументы тоже через СТЕК (на это повлиять ни как нельзя).
5. lmnlmn 69 09.01.25 16:19 Сейчас в теме
(4) Возможно у автора темы не везде где надо AllocMemory сделано.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот