gcc está ficando sem memória no Ubuntu 12.10

3

Estou tentando compilar meu projeto C no Ubuntu (32 bits) em execução no VirtualBox. Compilar o código em questão requer um pouco de memória, pelo menos 3 gig. Então eu dei o show da VM 2. Junto com 2 gig de espaço de troca disponível, deveria ser bastante. Por algum motivo, o gcc está falhando com um erro de falta de memória após ter alocado 900 meg ou mais. Bumping a quantidade de memória para 2,7 gig (o máximo permitido pelo VirtualBox) não ajudou. Parece haver um limite na quantidade de memória que um processo pode usar. Mas quando eu executo ulimit , ele mostra "ilimitado".

UPDATE - Aqui está o log do make:

libtool: compile: cc -msse2 -I. -I/home/cleong/qb -DPHP_ATOM_INC -I/home/cleong/qb/include -I/home/cleong/qb/main -I/home/cleong/qb -I/usr/include/php5 -I/usr/include/php5/main -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: out of memory allocating 408 bytes after a total of 924852224 bytes

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

Saída de / 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

A versão do gcc é a 4.7.2.

O código fonte está aqui:

link

É uma extensão do PHP. O processo de compilação usa o phpize.

UPDATE - Estou encontrando o mesmo problema na Mageia 3 de 32 bits, que também inclui o gcc 4.7.2. O fracasso acontece em torno de 2,7 gig. Em um ambiente de 64 bits, isso não acontece.

Se eu instalar o gcc 4.6.3 e construir usando isso, ele funciona.

    
por cleong 22.03.2013 / 18:18

2 respostas

2

O fato de que, com o nível de otimização de -O1 ou menor, o Ubuntu de 64 bits consegue compilar o projeto significa que o problema está na fase de otimização do gcc.

Eu diria que algum arquivo de origem em seu projeto acontece com um erro ou ineficiência no otimizador gcc introduzido na versão 4.7.2. que causa o uso de uma quantidade excessiva de memória.

Então, o que eu sugiro é:

  1. Uma versão de 32 bits do gcc pode acessar apenas 2-3 GB de memória (qualquer tamanho que seja a troca).
  2. Aumente o espaço de troca, mas continue lendo se isso não ajudar. Em qualquer caso, para um gcc de 32 bits, haverá um limite para a quantidade de memória que ele pode usar.
  3. Ao compilar os arquivos de origem um por um, localize aquele que é responsável pelo problema. Se isso é tudo, então o problema é com alguns arquivos de inclusão.
  4. Se o problema não for com um arquivo de inclusão, divida ainda mais a problemática arquivo fonte em várias partes, até que você pare de receber o erro ou localize a função que o causa.
  5. Como solução temporária, modifique o arquivo de criação para compilar essa função com -O1 . O problema é, neste caso, com o próprio gcc, e você pode enviar essa função em um relatório de erros (junto com todos seus arquivos de inclusão).
  6. Você pode também optar por compilar o projeto inteiro com -O1 que deve ser suficiente para uma extensão PHP, ou ficar com o gcc 4.6.3 no momento.
  7. Continue experimentando novas atualizações no gcc, já que o bug pode ter sido corrigido (ou a ineficiência removida) sem relação com o relatório de erros.
por 26.05.2013 / 17:39
0

Uau, isso é um projeto!

Parece que você terá que usar um compilador cruzado em execução no sistema host de 64 bits para criar este projeto. Firefox é construído de tal forma IIRC.

O GCC provavelmente esgotou todo o seu espaço de endereçamento devido à fragmentação da memória virtual, e também 900 meg você vê nas estatísticas é provavelmente uma memória física comprometida, que geralmente é menor que a memória virtual reservada.

Além disso, todo processo de 32 bits pode acessar não mais do que 2 Gb de memória, não importando qual tamanho de memória física e arquivo de troca você tenha.

    
por 22.03.2013 / 18:33