O que é uma boa configuração RLIMIT_CORE se eu quiser apenas backtrace?

2

tudo

Meu programa C ++ gera um dump principal de até 2 GB e rapidamente preenche todo o espaço disponível em disco. O que eu realmente preciso é apenas backtrace. Eu queria saber qual é o tamanho seguro do arquivo de despejo principal se eu quiser preservar o backtrace. Além disso, fiquei me perguntando se existem outras soluções inteligentes.

Obrigado! James

    
por James Gan 31.03.2015 / 18:56

1 resposta

2

Você pode canalizar o coredump diretamente em um programa que salva o rastreamento em um local temporário, busca o backtrace, coloca-o em algum lugar onde o usuário pode acessá-lo e remove o núcleo. Veja man 5 core para um exemplo de como fazer algo com um padrão de coredump. Essencialmente, você pode definir o valor de controle do kernel kernel.coredump_pattern pipe do coredump em um programa específico. Desta forma, você tem controle total sobre a lógica de quando salvar um coredump e quando não. Esteja ciente de que o programa no qual você canaliza é executado como root! |/usr/local/bin/coredump_it.sh seria um exemplo disso.

Como alternativa, systemd já fornece funcionalidade para isso. Se você definir o padrão coredump como assim

kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e

Então você pode usar o comando coredumpctl para armazenar e recuperar o backtrace do dito coredump. Por exemplo, onde o coredump é para PID 24164 ..

coredumpctl info 24164
$ coredumpctl info 24164
           PID: 24164 (bintree)
           UID: 1000 (matthew)
           GID: 1000 (matthew)
        Signal: 11 (SEGV)
     Timestamp: Mon 2015-02-09 19:14:13 GMT (1 months 19 days ago)
  Command Line: ./bintree
    Executable: /home/matthew/Testbed/trees/binary/bintree
 Control Group: /user.slice/user-1000.slice/session-1.scope
          Unit: session-1.scope
         Slice: user-1000.slice
       Session: 1
     Owner UID: 1000 (matthew)
       Boot ID: 82a18962ecc34109965530967f12150b
    Machine ID: 69d27b356a94476da859461d3a3bc6fd
      Hostname: home.localdomain
       Message: Process 24164 (bintree) of user 1000 dumped core.

                Stack trace of thread 24164:
                #0  0x0000000000400680 bintree_fetch (bintree)
                #1  0x0000000000400a7e main (bintree)
                #2  0x000000316fc1ffe0 __libc_start_main (libc.so.6)
                #3  0x0000000000400589 _start (bintree)

Você pode apenas chamar coredumpctl diretamente para obter uma lista de coredumps salvos.

    
por 31.03.2015 / 22:03