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

Ошибка в 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
      Большое спасибо! Посмотрю. Но, судя по всему, даже если удастся заставить его сохранять чертеж с трехзначным исполнением, видимо, в той же спецификации правильного отображения не добиться. У Леона с товарищем был об этом разговор, что солид вроде как не воспринимает исполнения дальше двузначного. Хотя, может и я неправильно понял. Вернусь к этому вопросу чуть позже. Еще раз спасибо за совет.
    • mrVladimir
      @gudstartup @Viktor2004 спасибо Вам за такое участие.  Я вот тоже в maintenance manual заглянул (наконец-то ). А вот фраза "при замене FROM/SRAM необходимо ..." (под пунктом 3 во вложении) не подразумевает, что появление ps5523 произойдет только если мы решим на нашей чпу поменять именно FROM/SRAM. А при замене других печатных плат (в том числе и материнской ) необходимо только как написано в пункте 2 восстановить данные памяти SRAM и, при необходимости, файлы пользователя. Нет?
    • maxx2000
      @davidovka это же очевидно. Вдруг нужного размера не окажется  как в анекдоте  
    • davidovka
      А для чего и сотни исполнений в таблице и гибкость одновременно?
    • ak762
      в СВ есть встроенный калькулятор для расчета балок при различных сценариях нагружения если ваш профиль монорельса совпадает с предопределенными профилями то можно прикинуть поведение монорелься без анализа на картинке 2 расчета двутавровой балки в качестве теста    
    • Viktor2004
      @mrVladimir не спешите отчаиваться. Вопрос спорный Я завел новую тему в которой мы это выясним  
    • Viktor2004
      Уважаемые специалисты. У кого был опыт замены фануковских плат? Именно на ЧПУ. Пожалуйста напишите какое ЧПУ и какую плату меняли И результат. Подошла или не подошла  
    • gudstartup
      @mrVladimir к сожалению с вашей платой все не так просто вам придется приобрести ее клон то есть она должна быть подготовлена продавцом и в нее должен быть записан серийный номер вашей старой платы он на штрихкоде а так готовить умеют не все или готовьтесь к сертификации опций также есть еще один аппаратный вариант но не каждый будет на новую плату м\сх перепаивать с риском превратить ее в кирпич.   если бы у вас был отдельный модуль процессора то вы бы просто переставили его в новую плату и все а с этой платой из-за ее не модульности намучаешься
    • SAPRonOff
      в окне состава изделия снять замочки у колонки позиция, тогда генератор колонки состава изделия не будет им присваивать свои значения автоматически, а запомнит то - что вы поставили или стояло до изменений проекта: 
    • Kelny
      Смотреть надо процедуру main, почти в самом конце: Слева от этих строк на сером поле ставите красные точки (клик мышкой) и запускаете макрос, когда макрос дойдёт до обозначенных строк можно будет наводить мышку на перменные, например, sPathName и смотреть значения, что бы определить где сбой: Для продолжения выполнения макроса нажимаем зелёный треугольничек (как кнопка Play).      
×
×
  • Создать...