[linux] - page allocation failure

0

Witam!

Mam problem z programem napisanym pod linuxa. Jest to niewielki, chodzący na ARMie, odczytujący dane z magistrali I2C i zapisujący te dane do bazy danych SQLite. Po jakiejś godzinie działania program przestaje działać. Z 'dmesg | less' wyciągnąłem takie informacje:

Out of memory: kill process 8577 (licz) score 1012 or a child
Killed process 8577 (licz)
licz invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0
Backtrace:
[...]

Out of memory: kill process 8832 (licz) score 532 or a child
Killed process 8832 (licz)
[...]

Out of memory: kill process 9106 (sh) score 1051 or a child
Killed process 9110 (licz)
licz: page allocation failure. order:0, mode:0x201da
Backtrace: 
[...]

Nie jestem pewien czy te wszystkie błędy są z jednego uruchomienia programu, bo system już chodzi jakiś czas a program był testowany kilka razy. Jest w tym programie jeden osobny wątek, a poza tym nic nadzwyczajnego raczej tam się nie dzieje. Może jakieś pomysły co może być przyczyną?

z góry dzięki
pozdrawiam
herszt

0

Tak, masz ogrooomne wycieki pamieci. Jesli jest niewielki a masz zrodla, to moze je wrzuc i ktos sie pokusi od jego analize. Jesli nie, to sam postaraj sie znalezc te wycieki pamieci.

0

Jeden, nieco dłuższy fragment kodu. Mam tam w pętli wskaźniki (const unsigned char*) i to zapewne one zaśmiecają:

for(int sqliteTry=0; sqliteTry<5; sqliteTry++)
{
        rc_db=1;
		     
	rc_db = sqlite3_open (database_name, & db);
  
	if(SQLITE_OK==rc_db)
	{
	  for(int n=0; n<300; n++)
	      {
		  query[n]='\0';
	      }
	  sprintf(query, "SELECT * FROM devices WHERE device_type='impuls' AND cron='1'");
	  rc_db=sqlite3_prepare_v2 (db, query, strlen (query) + 1, & stmt, NULL);
	}

	if(SQLITE_OK==rc_db)
	    {
		row=0;

		while (1) 
		    {
		      int s;
		      s = sqlite3_step (stmt);
  
		      if (s == SQLITE_ROW) {
			  const unsigned char * text;
			  const unsigned char * text1;
			  const unsigned char * text2;
			  const unsigned char * text3;
  
			  text  = sqlite3_column_text (stmt, 0);
			  devices_id_temp[row]=atoi(text);
			  text1  = sqlite3_column_text (stmt, 2);
			  device_adress_temp[row]=atoi(text1);
			  text2  = sqlite3_column_text (stmt, 4);
			  cron_temp[row]=atoi(text2);
			  text3  = sqlite3_column_text (stmt, 5);
			  interval_save_temp[row]=atoi(text3);	
			  czas_ostatniego_odczytu_temp[row]=0;
			  row++;
			  
		      }
		      else if (s == SQLITE_DONE) {
			  break;
		      }
		      else {
			  fprintf (stderr, "Nie udalo sie odczytac device_id, device_adress, interval_save!\n\r");
			  break;
		      }
		    }

		    liczba_urzadzen_temp=row;
		    sqlite3_reset(stmt);
		    sqlite3_close(db);
		    break;
	      }
	sleep(1);
}

Jak czyścić po sobie ten bałagan po każdym wykonaniu pętli wiedząc, że sqlite3_column_text(); zwraca const unsigned char *? Oczywiście te zmienne gdzieś na zewnątrz wrzucę. Próbowałem już jakiejś alokacji pamięci, ale cały czas mi się typy kłócą.

z góry dzięki
pozdrawiam
herszt

1 użytkowników online, w tym zalogowanych: 0, gości: 1