gcc sta esaurendo la memoria in Ubuntu 12.10


3

Sto cercando di compilare il mio progetto C in Ubuntu (32 bit) in esecuzione in VirtualBox. Compilare il codice in questione richiede un bel po 'di memoria, almeno 3 gig. Così ho dato il concerto di VM 2. Insieme a 2 gig di spazio disponibile, dovrebbe essere sufficiente. Per qualche motivo sebbene gcc stia fallendo un errore di memoria insufficiente dopo che ha assegnato 900 megabyte. Bumping la quantità di memoria a 2,7 gig (il massimo consentito da VirtualBox) non ha aiutato. Sembra esserci un limite alla quantità di memoria che un processo può utilizzare. Ma quando corro ulimit, mostra "illimitato".

AGGIORNARE - Ecco il registro make:

libtool: compile: cc -msse2 -I. -I / home / cleong / qb -DPHP_ATOM_INC   -I / home / cleong / qb / include -I / home / cleong / qb / principale -I / home / cleong / qb -I / usr / include / php5 -I / usr / include / php5 / principale -I / usr / include / php5 / TSRM -I / usr / include / php5 / Zend -I / usr / include / php5 / ext -I / usr / include / php5 / ext / date / lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS = 64 -DHAVE_CONFIG_H -g -O2 -c /home/cleong/qb/qb_interpreter_gcc.c -fPIC -DPIC -o   .libs / qb_interpreter_gcc.o

cc1: memoria esaurita che alloca 408 byte dopo un totale di 924852224 byte

make: *** [qb_interpreter_gcc.lo] Errore 1

Uscita da / bin / time -v:

Command exited with non-zero status 2
    Command being timed: "make"
    User time (seconds): 62.09
    System time (seconds): 11.28
    Percent of CPU this job got: 64%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 1:53.02
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 1848592
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 9433
    Minor (reclaiming a frame) page faults: 1391779
    Voluntary context switches: 5642
    Involuntary context switches: 6069
    Swaps: 0
    File system inputs: 630360
    File system outputs: 1376
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 2

La versione di gcc è 4.7.2.

Il codice sorgente è qui:

https://github.com/chung-leong/qb

È un'estensione PHP. Il processo di compilazione utilizza phpize.

AGGIORNAMENTO - Sto riscontrando lo stesso problema in Mageia 3 a 32 bit, che include anche gcc 4.7.2. Il fallimento si verifica in circa 2,7 gig invece. In un ambiente a 64 bit, non succede.

Se installo gcc 4.6.3 e costruisco usando quello, funziona.


1
Sei sicuro che non ci siano problemi nel tuo codice? Non sono esperto ma 3gig di memoria per compilare un programma in C sembra eccessivo.
terdon

1
Includere la versione di gcc e le parti rilevanti del log di build (creare output o simili).
Ярослав Рахматуллин

Cosa succede se si compila senza ottimizzazione ("-O0")? Hai usato una versione a 64 bit di gcc?
harrymc

Funziona quando è -O1 o inferiore. Nella versione a 64 bit di Ubuntu, sono stato in grado di farlo compilare.
cleong

@ ciao prova ad aggiungere più spazio di swap come da questa domanda su Overflow dello stack. È chiaro che lo Swap da 2 GB di RAM + 2 GB non lo taglierà, prova con una partizione di swap da 8 GB.
Breakthrough

Risposte:


2

Il fatto che con il livello di ottimizzazione di -O1 o inferiore, Ubuntu 64-bit riesce a compilare il progetto significa che il problema sta nella fase di ottimizzazione di gcc.

Direi che alcuni file sorgente nel tuo progetto si verificano su un bug o inefficienza nell'ottimizzatore gcc introdotto nella versione 4.7.2. che causa l'uso di una quantità irragionevole di memoria.

Quindi quello che vorrei suggerire è:

  1. Una versione di gcc a 32 bit può accedere solo a 2-3 GB di memoria (qualunque dimensione sia lo swap).
  2. Ingrandisci lo spazio di swap, ma continua a leggere se questo non aiuta. In ogni caso, per un gcc a 32 bit ci sarà un limite alla quantità di memoria che può utilizzare.
  3. Compilando i file di origine uno per uno, trova quello responsabile per problema. Se questo è tutto, allora il problema è con alcuni file inclusi.
  4. Se il problema non riguarda un file di inclusione, rompi ulteriormente il problema fonte di file in più parti, fino a quando non si smetti di ricevere l'errore o localizzi la stessa funzione che lo causa.
  5. Come soluzione temporanea, modificare il file make in modo da compilare tale funzione con -O1. Il problema è in questo caso con gcc stesso, e puoi inviare tale funzione in un bug report (insieme a tutti i tuoi file di inclusione).
  6. Ovviamente puoi anche decidere di compilare l'intero progetto con -O1 che dovrebbe essere sufficiente per un'estensione PHP o rimanere con gcc 4.6.3 per il momento.
  7. Continua a provare i nuovi aggiornamenti di gcc, dal momento che il bug potrebbe essere corretto (o l'inefficienza rimossa) non correlato al tuo bug report.

0

Wow, questo è un progetto!

Sembra che dovrai utilizzare un cross-compiler in esecuzione su un sistema host a 64 bit per creare questo progetto. Firefox è costruito in questo modo IIRC.

GCC probabilmente ha esaurito tutto lo spazio degli indirizzi a causa della frammentazione della memoria virtuale, e anche 900 meg che si vedono nelle statistiche è probabilmente una memoria fisica impegnata, che di solito è inferiore alla memoria virtuale riservata.

Inoltre, ogni processo a 32 bit può accedere a non più di 2 GB di memoria, indipendentemente dalla dimensione della memoria fisica e del file di scambio che si ha.


Sono riuscito a compilare il progetto su Mageia, CentOS e tre versioni di Debian, sia a 32 che a 64 bit. Ha compilato bene in Ubuntu Server 12.04. Penso che sia qualcosa di specifico per Ubuntu 12.10.
cleong

@cleong su questi altri sistemi la compilazione ha richiesto così tanta memoria?
terdon

Lo fa. Solo la natura del codice.
cleong
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.