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

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

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




×
×
  • Создать...