LINUX.ORG.RU

Невыровненный адрес на выборке команды


0

0

Очень нужна помощь...
Ситуация такая, есть сервер, который шлет соответственно данные в сокет TCP. ОС - ОС2000. ЭВМ багет 83.
Какое-то время, все нормально, затем возникает exception : 
exception at 0x80022334 vecnum = 4 thread 0x8036e184

что значит "Невыровненный адрес на выборке команды". 

смотрим стек:

-> tt%10
GraphSubSysStart ()

8006d2fc kernThreadStub+124: GraphSubSysStart ()

802a6c00 GraphSubSysStart+1e4: GraphGetMessage ()

802a6718 GraphGetMessage+118: send (0, 802b62fc, -2143866600, -2144035972)

80047110 send+5c : sendit (-2144640260, 802b7038, -2147015408)

80046ee0 sendit+278 : sosend (0, 0, 80352be0, 803b7500, 0, 0)

8004ce14 sosend+76c : tcp_usrreq (80352ac8, -2143999008, 0, 8027aaf4, 0)

80060eb8 tcp_usrreq+300 : tcp_output (80352b20)

8005f774 tcp_output+f28 : ip_output (80352be0, 80352be0, 4, -2145004436, 0)

80059fa0 ip_output+498 : ether_output (803b6e00, 803b7500, 0, 800722c4)

80040fa0 ether_output+3f0 : ed_start ()

8001fda8 ed_start+46c : ed_pio_write_mbufs ()

8002153c ed_pio_write_mbufs+438: 800222c0 ([80372dd8, 8003cd6c, 0, 0]) 

сам текст функции: 

void GraphGetMessage( mqd_t hq )

{

   while( 1 )
   
   {

      unsigned int prio = 0;

      int len = 0;
 
      xmlDocPtr msg = NULL;

      if( ( len = mq_receive( hq, (char *)&msg, sizeof( xmlDocPtr ), &prio ) ) )

      {

	 xmlChar* buf=NULL;

	 int msg_len = 0;

         xmlDocDumpFormatMemory( msg, (xmlChar **)&buf, ( int * ) &msg_len, 0 );

         if( -1 == send( sock, buf, msg_len, 0 ) )

	 {	    
         
             KernelTrace( TRACE_FATAL, "GraphSubSys :send:  %s  ", strerror( errno ) ); //до сюда не доходит

             close(sock);
         }

	 xmlFree( buf );

         xmlFreeDoc(msg);
        
         }

   }

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

Ответ на: комментарий от cavia_porcellus

Если я еще в своем уме, вот так ни с того ни с сего вылезающий "невыровненный адрес" - это либо компилер что-то левое выдал, либо регистры кто-то портит, либо баг процессора. У меня на роботе все конструкторы, работающие с autocad на дюронах, давно усвоили, что прежде, чем перетащить линию, которая вылезает за пределы видимой области надо поменять масштаб так, чтобы она полностью в окно помещалать, иначе - виснет. Но тебе от этого не легче.

devinull ★★
()
Ответ на: комментарий от cavia_porcellus

Еще это может быть запись за пределы буфера. Может быть повреждение стека. Все, что угодно может быть.

Я предпринять, видимо, можно только одно - попытатться научиться искусственно провоцировать ошибку и смотреть в отладчике, что за команда обламывается, что у нее за адрес, что за операнды. И сравнить с тем, что было, когда она успешно выполнялась. Если конечно, она раньше выполнясь.

devinull ★★
()
Ответ на: комментарий от anonymous

Послал письмо. Если что, мои координаты есть в профиле.

devinull ★★
()

Вывела функцию в отдельный поток - вроде все хорошо =))) сижу с пальцами крестиками... Целый день разбирались с умными людьми, так и не нашли в чем проблема...

cavia_porcellus ★★★★
() автор топика

Когда-то работал с Багет83 и ОС2000. Таких проблем не возникало, но что-то с выравниванием памяти (на аппаратном уровне) там было... надобно на работе посмотреть записи, тогда скажу подробнее.

karak
()

Когда-то работал с Багет83 и ОС2000. Таких проблем не возникало, но что-то с выравниванием памяти (на аппаратном уровне) там было... надобно на работе посмотреть записи, тогда скажу подробнее.

karak
()
Ответ на: комментарий от karak

Посмотрите, пожалуйста =) Потому как вс - таки хотелось бы узнать

cavia_porcellus ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.