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

Ошибка в 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 пользователей

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




  • Сообщения

    • 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
      да информация о решенной проблеме очень важна так что будем ждать хороших новостей!
    • mrVladimir
      @gudstartup Спасибо Вам за помощь. Теперь дело в приобретении платы. Как что-то получится (сперва приобрести, потом поставить) обязательно отпишусь.
    • gudstartup
      а как вы taxid фирмы нашли?
    • gudstartup
      все что я написал в цитате выше по теме полная фигня в связи с вновь приобретённой информацией. можно менять любые компоненты в пределах серии чпу если только не меняете по или записываете oprminf но  всегда могут быть нюансы  @mrVladimir все должно получиться извините за то что выдал непроверенную информацию за мнение типа знающего эксперта оказывается я 
    • malvi.dp
      Какое у детали имя файла и как формируете Обозначение и Наименование? Вы каждое исполнение сохраняете в новый чертеж? Или это групповой чертеж? Если групповой-то имя конфигурации в нем быть не должно. Стоит ли галочка "Исполнение" "Из конфигурации"? На сколько мне не изменяет память макрос сохраняет файл чертежа с тем же именем что и файл модели в папке модели. В спецификации все правильно отображается, даже если знаков исполнений больше трех  
    • gudstartup
      и главная деталь чтобы на системе была remote option system а именно файл oprminf.000 c сертификатами и были ли проблемы с ними после замены компонентов.
    • boomeeeer
      с него родимого
    • Grundick
    • eljer0n
      Большое спасибо! Посмотрю. Но, судя по всему, даже если удастся заставить его сохранять чертеж с трехзначным исполнением, видимо, в той же спецификации правильного отображения не добиться. У Леона с товарищем был об этом разговор, что солид вроде как не воспринимает исполнения дальше двузначного. Хотя, может и я неправильно понял. Вернусь к этому вопросу чуть позже. Еще раз спасибо за совет.
×
×
  • Создать...