Страниц: [1]
  Печать  
Автор Тема: вопрос про приложение Photon  (Прочитано 3571 раз)
JimmyQNX
Jr. Member
**
Offline Offline

Сообщений: 50


Просмотр профиля
« : Июня 14, 2012, 09:08:40 am »

Добрый день всем участникам конференции! Существует программа написанная под Photon на qnx4. В меню вызываются окна для работы с БД Sybase. Вот на одной машине с недавних пор при попытке открыть одно окно, приложение полностью падает "... terminated (SIGSEGV) at 0007:00203E7F". Однако разработчиками реализован механизм восстановления приложений, т.е. программа перезапускается, но окно открыть не могу, оно сразу отваливается. Остальные окна открываются без проблем, а на идентичных машинах по конфигурации все окна открываются нормально. Причём через n-ю попытку окно всё-таки открывается, не падает. Однако  так не пойдёт Angry А! Ещё SIGSEGV постоянно один-два адреса, в другие не выпадает. Что можете посоветовать посмотреть?
Записан
AG
QOR.Moderator
*****
Offline Offline

Сообщений: 872



Просмотр профиля WWW
« Ответ #1 : Июня 14, 2012, 10:25:23 am »

Исходники есть? Если нет, то только обращаться к разработчику, ибо это его ошибка.
Записан

JimmyQNX
Jr. Member
**
Offline Offline

Сообщений: 50


Просмотр профиля
« Ответ #2 : Июня 14, 2012, 11:06:18 am »

Исходники есть. Конкретно ф-ция по этому окну, т.е. dialog-у. При создании других окон в этом приложении, кусок кода мал - вариация того что выделено красным ниже

Код:
PsaSigWinSetup( PtWidget_t *link_instance, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )
{
link_instance = link_instance, apinfo = apinfo, cbinfo = cbinfo;
/// TableWindowSetup( link_instance, ABW_psa_sig_list );
isn_a = CountRow("a_sig order by ln");
      TableWindowSetup( link_instance, ABW_psa_sig_list, ABW_psa_sig_listd);
is_multiple_mode = 0;
BlockWidget( ABW_password_win );
  int i;
  FILE *fk;
  FILE *fd;
  DIR *dirp;
  struct dirent *direntp;
  char *d_name;
  char workBuf[1024];   
  char *ptr;
  char *ptr1; 
  char *ptrBuf = &ptr[0]; 
  char node[_MAX_NODE];
  char dir[_MAX_DIR];
  char fname[_MAX_FNAME];
  char ext[_MAX_EXT]; 
  for (i = 0; i <list_frm.entries();i++) {
  tecFrm = list_frm.get(i);
  delete (tecFrm);
  }
  list_frm.clear();
  sprintf(workBuf,"%s%s",PATH_FORMULS,PATH_PSASIGS);
  if ((dirp = opendir(workBuf)) != NULL) { 
    while ((direntp = readdir(dirp)) != NULL){     
      fclose (fd);
      d_name = (char *)direntp->d_name;
      if ((i = strlen(d_name)) < 5)
        continue;
      _splitpath(d_name,node,dir,fname,ext);
      if (!strcmp(ext,EXT_FORMULS)) {                         
        sprintf(workBuf,"%s%s/%s",PATH_FORMULS,PATH_PSASIGS,d_name);
  if ((fd = fopen(workBuf,"r")) != NULL) {
    tecFrm = new Formul (fname);
    if (!tecFrm)
      break;
    list_frm.append(tecFrm);
///     sprintf(workBuf,"%s%s/%s%s",PATH_FORMULS,PATH_PSASIGS,fname,EXT_INTERPR);
///          fk = fopen(workBuf,"r");
          i = 0;
          while ((ptr = fgets(workBuf,sizeof(workBuf),fd)) == workBuf) {
              while (ptr[0] == ' ')
                ptr++;             
              if (!strncmp(ptr,"Name",4)) {
                while ((ptr[0] != '"')&&(ptr[0]!='\n')) 
                  ptr++; 
                if (ptr[0] == '"') { 
                  ptr++;
                  ptr1 = ptr;
                  while ((ptr1[0] != '"')&&(ptr1[0]!='\n')) 
                    ptr1++;
                    ptr1[0] = 0;
//                    sprintf(workBuf,"%s\t%s\t%s",ptr,fname,(fk)?"В…ГЎГўГ¬":"ВЌВҐГў");
                }
                else {
                  break;
                }                   
                PtListAddItems(ABW_ComboPSA,(char const **)&ptr,1,0);
                i++;
                break;
             }     
          }
          if (!i) {  
continue;
          } 
  }     
      }
    }
    tecFrm = 0;
///    fclose(fk);
    fclose(fd);
    closedir(dirp); 
  } 

return( Pt_CONTINUE );
}

   link_instance = link_instance, apinfo = apinfo, cbinfo = cbinfo;
///   TableWindowSetup( link_instance, ABW_psa_sig_list );
   isn_a = CountRow("a_sig order by ln");
      TableWindowSetup( link_instance, ABW_psa_sig_list, ABW_psa_sig_listd);
   is_multiple_mode = 0;
   BlockWidget( ABW_password_win );
« Последнее редактирование: Июня 14, 2012, 11:21:18 am от JimmyQNX » Записан
darkelf
QOR.Moderator
*****
Offline Offline

Сообщений: 259


Просмотр профиля
« Ответ #3 : Июня 14, 2012, 12:00:18 pm »

А что это там за два fclose(fd)? один после
Код:
while ((direntp = readdir(dirp)) != NULL){
и второй в самом конце? Не может произойти попытки закрытия уже закрытого файла?
Ну и вообще, можно попробовать собрать с отладочной информацией и запустить на той машине, где падает под отладчиком, может дело ещё в чем, может те файлы, что Вы читаете в этой процедуре побились.
Записан
AG
QOR.Moderator
*****
Offline Offline

Сообщений: 872



Просмотр профиля WWW
« Ответ #4 : Июня 14, 2012, 12:05:04 pm »

Уууу. Если исходники есть, собрать отладочную версию и поймать ошибку за хвост.
Записан

Страниц: [1]
  Печать  
 
Перейти в: