2012-11-06 16 views
6

w jednym z modułów naszej aplikacji, calloc() kończy się niepowodzeniem i zwraca NULL. Ilość pamięci, którą próbuje przydzielić, wynosi 9292 bajtów. System operacyjny to AIX 7.1 i działa VIOS 2.2.1.3.calloc nie działa i zwraca NULL

Maszyna ma pamięć RAM o pojemności 2 GB i nie wydaje się, aby wystąpił problem z brakiem pamięci. Ten sam moduł aplikacji działa dobrze na jednym z pozostałych pudełek, który ma te same konfiguracje co problematyczne pudełko. Kolejność jest fragmentem pamięci z obu pudełek i są one takie same!

PRACY BOX:

 
RLIMIT_AS  (infinite) (infinite) 
RLIMIT_CORE 1073741312 (infinite) 
RLIMIT_CPU  (infinite) (infinite) 
RLIMIT_DATA  134217728 (infinite) 
RLIMIT_FSIZE (infinite) (infinite) 
RLIMIT_NOFILE  2000 (infinite) 
RLIMIT_RSS  33554432 (infinite) 
RLIMIT_STACK  33554432 2147483646 

problematyczne BOX:

 
RLIMIT_AS  (infinite) (infinite) 
RLIMIT_CORE 1073741312 (infinite) 
RLIMIT_CPU  (infinite) (infinite) 
RLIMIT_DATA  134217728 (infinite) 
RLIMIT_FSIZE (infinite) (infinite) 
RLIMIT_NOFILE  2000 (infinite) 
RLIMIT_RSS  33554432 (infinite) 
RLIMIT_STACK  33554432 2147483646 

Jestem pojęcia jak naprawdę nie mogę zrozumieć dlaczego calloc() zawodzi nawet do 9292 bajtów na tym polu.

Dzięki

+0

Może fragmentacja pamięci? Nie ma wolnego bloku na tyle dużego, aby pasował do twojego przydziału? Kiedy alokacja się nie powiedzie, sprawdź np. 'errno', aby zobaczyć, co mówi? –

+0

Tak, myślałem tak samo, ale czy istnieje sposób, aby to udowodnić lub konkretnie o tym wiedzieć? numer błędu ENOMEM! Wyjście kratownicy pokazuje ten błąd! fragment z kratownicy na proces pokazuje ten lseek (3, 0, 1) \t \t \t \t \t = 4318 lseek (3, 0, 1) \t \t \t \t \t = 4318 lseek (3, 0, 1) \t \t \t \t \t = 4318 lseek (3, 242, 0) \t \t \t \t = 242 kread (3 "\ t K Inor V ersio" .., 4096) \t = 4096 lseek (3, 0, 1) \t \t \t \t \t = 4338 lseek (3, 222, 0) \t \t \t \t = 222 __libc_sbrk (0x00000000) \t \t \t \t Err 12 ENOMEM __libc_sbrk (0x00000000) \t \t \t \t Err 12 ENOMEM __libc_sbrk (0x00000000) \t \t \t \t Err 12 ENOMEM __libc_sbrk (0x00000000) \t \t \t \t Err 12 ENOMEM __l ibc_sbrk (0x00000000) \t \t \t \t Err # 12 ENOMEM – k2ibegin

+0

Pokaż nam kod, w tym wywołanie 'calloc' i kod, który sprawdza jego wynik. –

Odpowiedz

1

calloc Try (1, sizeof (ifp_handle_t)); zamiast calloc (sizeof (ifp_handle_t), 1); Być może źle, ale wygląda na to, że odwróciłeś parametry.

+0

Nie powinno to mieć znaczenia, chyba że twój komputer napełnia pojedyncze bajty ... ale masz rację, to jest 'calloc (nmemb, size)'. – DevSolar

+0

mmm .. nie sądzę, że to robi różnicę, ponieważ próbowałem również z malloc, a to też zawodzi. Co więcej, ten sam kod działa przez długi czas, dopiero gdy klient utworzył nową partycję i zmodernizował partycję VIOS VIOS 6.1 do 2.2.1.3. Podejrzewam, że jest mało miejsca na stronie lub może być coś związanego z opóźnieniem/wcześniejszą alokacją, które może być specyficzne dla systemu AIX. – k2ibegin

Powiązane problemy