Перейти к публикации

Ошибка в Teamcenter при выполнении handler


Рекомендованные сообщения

 Доброго времени суток!

может кто сталкивался с подобной проблемой.

написал Handler, который в зависимости от вида извещения формирует определенной сообщение и отправляет его по внутренней почте.

при компиляции, нет ни каких ошибок. при использовании handler-а в процессе. он отрабатывает, но иногда teamcenter просто отваливается.

если использовать на 4 звенном теряется связь с сервером. нет никакой закономерности, может отвалится и на 2, и на 10 раз.

с помощью логера отследил, где все валится

 

 

 

SAFE_CALL(EPM_ask_root_task(task, &root_task), ifail, root_task); 
logger::print_log(">> get root task\n");
if (ifail != ITK_ok || root_task == NULL_TAG) return;
logger::print_log(">> perem\n");
SAFE_CALL(EPM_ask_attachments(root_task, EPM_target_attachment, &targets_count, &targets), ifail, targets_count); 
logger::print_log(">> get attacment\n"); 
SAFE_CALL(AOM_ask_value_string(*targets, "ekp7_CMType", &type_izv), ifail, type_izv);
logger::print_log(">> get type izv\n"); logger::print_log(" ekp7_CMType - %s\n", type_izv);

что то происходит в :

SAFE_CALL(EPM_ask_attachments(root_task, EPM_target_attachment, &targets_count, &targets), ifail, targets_count); 

хотя выше точно такая же строчка выполнялась без проблем.

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

в котором вижу только такие ошибки:

ERROR - 2018/11/16-13:42:22.483 UTC -  - The loginUser is null, this is unexpected at this point in the Session.
The Session State will not be updated with information from the client service request.

 

ERROR - 2018/11/16-13:42:30.431 UTC -  - 65: CFI error: -65.
ERROR - 2018/11/16-13:42:30.431 UTC -  - loginUser::initialise failed for 515007 - Teamcenter at d:\workdir\tc114w1201_64\src\core\tc\loginuser.cxx(582)

 

 ERROR 26003 ITK_internal_error: Unclassified error/exception. See system log file for possible explanation.
       ERROR515007 POM has not started.

 

которые не очень информативны для меня.

 

 

может кто сталкивался с подобной проблемой. если ошибка в коде, тогда почему хэндлер отрабатывает.

вообще в какую сторону копать? EPM_ask_attachments использую выше этого места, там все отрабатывает. Поэтому решил, получить нужные мне свойства, тогда когда она отработала без проблем.

для этого переписал , но в итоге точно такая же ошибка возникла:

SAFE_CALL(AOM_ask_value_tags(*atts, "CMHasProblemItem", &n_problem, &CMHasProblemItem), ifail, n_problem);

хотя выше AOM_ask_value_tags выполнялось без ошибки.

в системном журнале те же сообщения:  The loginUser is null, this is unexpected at this point in the Session.

 

За раннее благодарен за любую подсказку!

Ссылка на сообщение
Поделиться на других сайтах


loginUser is null  это уже следствие разорванной сессии. Обычно когда жестко сыпется модуль при выполнении зачастую ошибка бывает простой - где-то NULL попался,выход за пределы массива итп

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, lexx174 сказал:

loginUser is null  это уже следствие разорванной сессии. Обычно когда жестко сыпется модуль при выполнении зачастую ошибка бывает простой - где-то NULL попался,выход за пределы массива итп

нужно на прямую объявить:

targets = (tag_t *) MEM_realloc (targets, sizeof(tag_t) * 1);

на 1 умножаю, так как я всегда знаю, что извещение в процессе всегда одно.

Это я уже делал, но результат тот же(

Изменено пользователем nbg
Ссылка на сообщение
Поделиться на других сайтах
1 час назад, lexx174 сказал:

киньте весь кусок кода если возможно

void add_targets(string *body, tag_t task){
	int targets_count, ifail = ITK_ok;
	tag_t *targets = NULL;
	tag_t root_task = NULL_TAG;
	tag_t *atts = NULL_TAG, *CMHasImpactedItem =  NULL_TAG, *CMHasSolutionItem =  NULL_TAG;
	tag_t *EC_solution_item_rel = NULL_TAG, *CMHasProblemItem = NULL_TAG, *status = NULL_TAG;
	char *type_izv = NULL, *spb5_Oboznachenie = NULL, *item_revision_id = NULL, *object_name= NULL, *name = NULL; 
	int n_change, n_new, n_solution,n_problem, n_status;
	//****************************
	logger::print_log(">> add_targets\n");
	SAFE_CALL(EPM_ask_root_task(task, &root_task), ifail, root_task);
	logger::print_log(">> get root task\n");
	if (ifail != ITK_ok || root_task == NULL_TAG) return;

	logger::print_log(">> perem\n");
	//*******************************************падает в этом месте
	SAFE_CALL(EPM_ask_attachments(root_task, EPM_target_attachment, &targets_count, &targets), ifail, targets_count);
	logger::print_log(">> got attacment\n");
	
      SAFE_CALL(AOM_ask_value_string(*targets, "ekp7_CMType", &type_izv), ifail, type_izv);
	  logger::print_log(">> get type izv\n");
      logger::print_log(" ekp7_CMType - %s\n", type_izv);
	 
	 if (strcmp (type_izv, "01") == 0)
	 {
		 
		 logger::print_log(">> get change item\n");
		 (*body).append("<br><br><b>Изменяемые элементы:</b> <br>");
	     (*body).append("<table border=\"1\"><tr><th>Имя</th><th>Статус</th></tr>");
		 SAFE_CALL(AOM_ask_value_tags(*targets, "CMHasImpactedItem", &n_change, &CMHasImpactedItem), ifail, n_change);
		 if (ifail != ITK_ok || CMHasImpactedItem == NULL) return;
		 if (n_change >0)
		 {
			 char ** change_it = (char**) malloc(n_change + 1);
			 string statusItog;
			 for (int i = 0; i < n_change; i++) {
			    
				SAFE_CALL(AOM_ask_value_string(CMHasImpactedItem[i], "spb5_Oboznachenie", &spb5_Oboznachenie), ifail, spb5_Oboznachenie);
				SAFE_CALL(AOM_ask_value_string(CMHasImpactedItem[i], "item_revision_id", &item_revision_id), ifail, item_revision_id);
				SAFE_CALL(AOM_ask_value_string(CMHasImpactedItem[i], "object_name", &object_name), ifail, object_name);
				//get status
				SAFE_CALL(AOM_ask_value_tags(CMHasImpactedItem[i], "release_status_list", &n_status, &status), ifail, n_status);
				logger::print_log(">> get status!!!!!!!\n");
				char ** status_det = (char**) malloc(n_status + 1);
				for (int j = 0; j < n_status; j++){
					SAFE_CALL(AOM_ask_value_string(status[j], "object_string", &name), ifail, name);
					//status_det[j] = name;
					statusItog.append(name);
					statusItog.append("; ");
					logger::print_log("status - %s\n", statusItog);
				
				}
				strcat(spb5_Oboznachenie, "/");
				strcat(spb5_Oboznachenie, item_revision_id);
				strcat(spb5_Oboznachenie, "-");
                change_it[i] = strcat(spb5_Oboznachenie, object_name);
				logger::print_log(" Изменяемые элементы - %s\n", change_it[i]);
				(*body).append("<tr>");
				(*body).append("<td>");
				(*body).append(change_it[i]);
				(*body).append("</td>");
				(*body).append("<td>");
				(*body).append(statusItog);
				(*body).append("</td>");
				(*body).append("</tr>");
				
				statusItog="";
 }
		 }
		 
		 (*body).append("</table>");
		
		 MEM_free(CMHasImpactedItem);

		  logger::print_log(">> get new item\n");
		 // get new item
		  (*body).append("<br><br><b>Новые элементы:</b> <br>");
	      (*body).append("<table border=\"1\"><tr><th>Имя</th><th>Статус</th></tr>");

 

Изменено пользователем nbg
Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, koner сказал:

у вас падает на 


EPM_ask_attachments?

И это стабильно воспроизводится?

 

да,

единственное EPM_ask_attachments выполняется выше для других целей. я решил раз уж там получил, заодно и получить нужные данные там. но тогда ошибка переместилась на 

SAFE_CALL(AOM_ask_value_tags(*atts, "CMHasProblemItem", &n_problem, &CMHasProblemItem), ifail, n_problem);

на сколько понимаю, природа ошибки одна и та же. выше для другого поля AOM_ask_value_tags выполнилась без проблем.

Ссылка на сообщение
Поделиться на других сайтах

У вас скорее всего ошибка с памятью, и вероятно это до вызова add_targets.
И что за функция SAFE_CALL, может в ней что то не то.
Больше тут в начале ничего не видно.

Ссылка на сообщение
Поделиться на других сайтах

А попробуйте этот обработчик протестировать в другом шаблоне процесса

2 минуты назад, koner сказал:

У вас скорее всего ошибка с памятью, и вероятно это до вызова add_targets.
И что за функция SAFE_CALL, может в ней что то не то.
Больше тут в начале ничего не видно.

SAFE_CALL - это макрос

Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, koner сказал:

У вас скорее всего ошибка с памятью, и вероятно это до вызова add_targets.
И что за функция SAFE_CALL, может в ней что то не то.
Больше тут в начале ничего не видно.

SAFE_CALL точно не причем, он нужен для логирования. вполне можно без него

имеете в виду на предыдущей функции? или в принципе где то выше может быть ошибка?

а здесь уже как следствие, что выше уже что то произошло

6 минут назад, lexx174 сказал:

А попробуйте этот обработчик протестировать в другом шаблоне процесса

SAFE_CALL - это макрос

я так думаю это ничего не даст, так как я тестирую на самом простом процессе из одного этапа. до этого было на нем 2 этапа, но сейчас один удалил. 

Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, nbg сказал:

имеете в виду на предыдущей функции? или в принципе где то выше может быть ошибка?

а здесь уже как следствие, что выше уже что то произошло

да. это очень похоже на ошибку с памятью.

Ссылка на сообщение
Поделиться на других сайтах

koner верно подметил - эти ошибки приводящие к к разрыву сессии - зачастую ошибки связанные с памятью. И действительно ошибка может быть выше а не в этой именно функции. Проверьте выделение и освобождение памяти

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, lexx174 сказал:

koner верно подметил - эти ошибки приводящие к к разрыву сессии - зачастую ошибки связанные с памятью. И действительно ошибка может быть выше а не в этой именно функции. Проверьте выделение и освобождение памяти

я объявлял динамический массив

char ** buffer = (char**) malloc(n_signs + 1);

может быть это причиной?

Ссылка на сообщение
Поделиться на других сайтах
11 минуту назад, nbg сказал:

char ** buffer = (char**) malloc(n_signs + 1);

это ниочем.
Нужно весь код смотреть.

Ссылка на сообщение
Поделиться на других сайтах
12 минуты назад, koner сказал:

это ниочем.
Нужно весь код смотреть.

void get_inf_about_task(tag_t task, char **current_task_name, char **comment, char **process_name, char **template_task_name,char **os_username, tag_t * epm_proposed_reviewers,  char **gr, char **description, char **type_izv, string *vstavka){
	logger::print_log(">> get_inf_about_task\n");
	int ifail = ITK_ok;

	SAFE_CALL(AOM_ask_value_string(task, "object_name", current_task_name), ifail, *current_task_name);
	

	SAFE_CALL(AOM_ask_value_string(task, "comments", comment), ifail, *comment);
	if (comment == NULL || !strcmp((*comment), "")) {
		strcpy((*comment), "(нет)");
	}
	
	tag_t job = NULL_TAG;
	SAFE_CALL(EPM_ask_job(task, &job), ifail, job);
	if (ifail == ITK_ok && job != NULL_TAG)
		SAFE_CALL(AOM_ask_value_string(job, "object_name", process_name), ifail, *process_name);

	tag_t root_task = NULL_TAG;
	//*************************************
	int att_count = -1;
	 tag_t *atts = NULL_TAG;
	 tag_t user = NULL_TAG;
	 tag_t **objects;
	 int n_signs = -1;
	 char*   user_name = NULL;
	 tag_t user_tag = NULL_TAG;
	 //************************************
	SAFE_CALL(EPM_ask_root_task(task, &root_task), ifail, root_task);
	if (ifail == ITK_ok && root_task != NULL_TAG){
		SAFE_CALL(AOM_ask_value_string(root_task, "object_name", template_task_name), ifail, *template_task_name);
		//*******************************************************************************************************
			//Returns all the objects attached to the given task (for the given attachment type). 
	        SAFE_CALL(EPM_ask_attachments(root_task, EPM_target_attachment, &att_count, &atts), ifail, att_count);
			SAFE_CALL(AOM_ask_value_string(*atts, "object_desc", description), ifail, *description);
			SAFE_CALL(AOM_ask_value_string(*atts, "ekp7_CMType", type_izv), ifail, *type_izv);
			logger::print_log("att_count - %d\n", att_count);
			SAFE_CALL(AOM_ask_value_tags(*atts, "epm_proposed_reviewers", &n_signs, &epm_proposed_reviewers), ifail, n_signs);
			logger::print_log(" количество в списке кому рассылать n_signs - %d\n", n_signs);
			if (n_signs > 0)
			{
				char * mail =NULL; 
				char ** buffer = (char**) malloc(n_signs + 1);
				
				
				for (int i = 0; i < n_signs; i++) 
				{
					ifail = SA_ask_groupmember_user(epm_proposed_reviewers[i], &user_tag);
					if (user_tag != NULL_TAG)
						logger::print_log(">> получили пользователя из  groupmember\n");
					//get os_username			
					ifail = AOM_ask_value_string(user_tag, "os_username", os_username);
					SAFE_CALL(AOM_ask_value_string(user_tag, "os_username", os_username), ifail, *os_username);
					buffer[i] = *os_username;
					logger::print_log("*os_user - %s\n", *os_username);
				}
				
				char *t = buffer[0];
				strcat(t, TUPOLEV); 
				strcat(t, "; ");
				for (int i = 1; i < n_signs; i++) {
				   logger::print_log(">> print print print print\n");
				   strcat(buffer[i], TUPOLEV);
				   strcat(buffer[i], "; ");
				   logger::print_log("buffer[i] - %s\n", buffer[i]);
				   strcat(t, buffer[i]); 
				}
				*gr = t; 				
			}
		//****************************************************************************************************************
			//формируем тело письма
			tag_t  *CMHasImpactedItem =  NULL_TAG, *CMHasSolutionItem =  NULL_TAG;
	        tag_t *EC_solution_item_rel = NULL_TAG, *CMHasProblemItem = NULL_TAG, *status = NULL_TAG;
			char *spb5_Oboznachenie = NULL, *item_revision_id = NULL, *object_name= NULL, *name = NULL; 
			int n_change, n_new, n_solution,n_problem, n_status;

		 if (strcmp (*type_izv, "13") == 0){
	     // Уведомление об ошибке
		 logger::print_log(">> type_izv, 13\n");
		 logger::print_log(">> get problem item:\n");

		 (*vstavka).append("<br><br><b>Проблемные элементы:</b> <br>");
	     (*vstavka).append("<table border=\"1\"><tr><th>Имя</th><th>Статус</th></tr>");
		 logger::print_log(">> vstavka");
		 SAFE_CALL(AOM_ask_value_tags(*atts, "CMHasProblemItem", &n_problem, &CMHasProblemItem), ifail, n_problem);
		   logger::print_log(">> CMHasProblemItem:\n");
		  if (ifail != ITK_ok || CMHasProblemItem == NULL) return;
		 if (n_problem >0)
		 {
			 //char ** problem_it = (char**) malloc(n_problem + 1);
			 char ** problem_it = (char**) malloc(n_problem * sizeof(int));
			 //char ** problem_it = (char**) MEM_alloc(n_problem + 1);
			 string statusItog2;
			 for (int i = 0; i < n_problem; i++) {
			    
				SAFE_CALL(AOM_ask_value_string(CMHasProblemItem[i], "spb5_Oboznachenie", &spb5_Oboznachenie), ifail, spb5_Oboznachenie);
				SAFE_CALL(AOM_ask_value_string(CMHasProblemItem[i], "item_revision_id", &item_revision_id), ifail, item_revision_id);
				SAFE_CALL(AOM_ask_value_string(CMHasProblemItem[i], "object_name", &object_name), ifail, object_name);
				//get status
				SAFE_CALL(AOM_ask_value_tags(CMHasProblemItem[i], "release_status_list", &n_status, &status), ifail, n_status);
				logger::print_log(">> get status!!!!!!!\n");
				char ** status_det = (char**) malloc(n_status + 1);
				for (int j = 0; j < n_status; j++){
					SAFE_CALL(AOM_ask_value_string(status[j], "object_string", &name), ifail, name);
					//status_det[j] = name;
					statusItog2.append(name);
					statusItog2.append("; ");
					logger::print_log("status - %s\n", statusItog2);
				
				}
				strcat(spb5_Oboznachenie, "/");
				strcat(spb5_Oboznachenie, item_revision_id);
				strcat(spb5_Oboznachenie, "-");
				problem_it[i] = strcat(spb5_Oboznachenie, object_name);
					
				logger::print_log("Проблемные элементы - %s\n", problem_it[i]);

				(*vstavka).append("<tr>");
				(*vstavka).append("<td>");
				(*vstavka).append(problem_it[i]);
				(*vstavka).append("</td>");
				(*vstavka).append("<td>");
				(*vstavka).append(statusItog2);
				(*vstavka).append("</td>");
				(*vstavka).append("</tr>");

				statusItog2="";
			 }
		 }
		 (*vstavka).append("</table>");

		 MEM_free(CMHasProblemItem);
	 }
			
	


        //****************************************************************************************************************  

	}
}

 

Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, koner сказал:

а куда делось 


add_targets

это уже второй вариант, чтобы 2 раза не определять цели проекта

Ссылка на сообщение
Поделиться на других сайтах

это видимо опять не весь код
strcpy((*comment), "(нет)");
копируете в comment, а память для него выделена?


 

Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, koner сказал:

это видимо опять не весь код
strcpy((*comment), "(нет)");
копируете в comment, а память для него выделена?


 

void get_inf_about_task(tag_t task, char **current_task_name, char **comment,..........
Изменено пользователем nbg
Ссылка на сообщение
Поделиться на других сайтах
19 минут назад, nbg сказал:

память для него выделена

    SAFE_CALL(AOM_ask_value_string(task, "comments", comment), ifail, *comment);
    if (comment == NULL || !strcmp((*comment), "")) {
        strcpy((*comment), "(нет)");
    }
тут ошибка, нельзя записывть в commen "нет". 


 

память для comment выделяет teamcenter, а вы ее должны освободить.
писать в commet както не правильно.
тогда так.
елси comment==NULL выделяйте память. если пустой то освобождайте а потом выделяйте.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




  • Сообщения

    • gudstartup
      @boomeeeer может от страны зависит
    • david1920
      нет время нет заниматься да и информации новой нет Это я на других станках делал
    • gudstartup
      @david1920 имеется ввиду платы на системах с сертификацией опций фалом oprminf старые в расчет не принимаются вы свой 18i восстановили?
    • gudstartup
      очень даже спрашивают как обязательную информацию для проверки вашей компании налоговый идентификатор должен быть указан. на myfanuc не спрашивают а вот на портале к сожалению просто так не зарегаться. 
    • david1920
      На 0I-TC mate менял плату управления приводами На 18i-TB менял для диагностики платы процессоров (один был от Spinner другой простой) процы были одинаковые Всё работает
    • brigval
      Браком 1.04В версии 1.04Добавлено: Автоуменьшение высоты шрифта многострочного наименования в ОН чертежа.Добавлено: Переименование поверхностей, баз, размеров в порядке их следования на чертеже.Добавлено: Переименование изображений по ГОСТ: сначала виды, затем разрезы, сечения, выносные элементы.Добавлено: Выравнивание неассоциативных видов.Добавлено: Ручной ввод шага и угла наклона штриховки.Добавлено: Перемещаются в макроэлемент компоненты, исключаемые из спецификации.Добавлено: Выбор количества значащих цифр в значении площади поверхности детали для вставки в ТТ.Добавлено: Возможность не авторазмещать ТТ перед конвертацией чертежа в PDF.Добавлено: Добавлены кнопки «Выделить все включенные в расчет» и Выделить все исключенные из расчета».Добавлено: Версия КОМПАС-3D Home показывается в программе со словом Home.Добавлено: Улучшен алгоритм считывания и вставки ТТ чертежа.Добавлено: При конвертации чертежа в PDF удаляется старый файл с таким же обозначением в начале имени, как обозначение в начале имени нового файла.Добавлено: Улучшено считывание номеров позиций из 3D-модели сборки.Исправлено: Иногда скрытые и потом показанные объекты чертежа отображались не серым цветом.Исправлено: Иногда после ручного заполнения графы «Масса» ОН чертежа в окне программы масса могла отображаться не правильно.Исправлено: В некоторых случаях из ОН чертежа могла не считываться литера.Исправлено: В некоторых окнах программы неправильно показывался заголовок окна программы.Исправлено: Другие замеченные мелкие ошибки и неточности кода.Скачать
    • boomeeeer
      Не помню чтобы у меня такое спрашивали при регистрации.
    • Snake 60
      @eljer0n  Откройте макрос SaveDRW.swp редактором VBA Найдите вот эти строки: Поменяйте выделенную цифру на нужную вам 3 или 4 - это количество символов которое останется от имени конфигурации. PS При сохранении в PDF тоже ругается на неправильное название чертежа, т.к. тоже обрезает название конфигурации до двух знаков, там тоже надо править при желании...
    • eljer0n
      @malvi.dp в общем порядок следующий (на каждое исполнение свой чертеж и позиция в спецификации):   Для исполнения с 2мя знаками. 1. Есть деталь с именем формата ХХ-01.01-01 (последнее -01 это исполнение) 2. В Мпроп детали назначается исполнение из конфигурации (как у вас на картинке). Отображается корректно 3. Создается чертеж по модели, исполнение в основной надписи чертежа детали отображается корректно. 4. Сохраняется через SaveDRW с корректным именем. 5. В спецификации сборки все отображается корректно.     Для исполнения с 3мя знаками. 1. Есть деталь с именем формата ХХ-01.01-011 (последнее -011 это исполнение) 2. В Мпроп детали назначается исполнение из конфигурации. Отображается корректно 3. Создается чертеж по модели, исполнение в основной надписи чертежа детали отображается корректно. 4. Сохраняется через SaveDRW с некорректным именем, а именно - с обрезанным до двух знаков исполнением (-01). 5. В спецификации сборки шифр отображается (внезапно! может какой глюк был: у солида или у меня ) корректно, как и у вас на рисунке.     Выходит, загвоздка все-таки только в сохранялке чертежа.
    • gudstartup
      да информация о решенной проблеме очень важна так что будем ждать хороших новостей!
×
×
  • Создать...