Pergunta

Eu quero um programa C para produzir um dump de memória sob certas circunstâncias. Este é um programa que é executado em um ambiente de produção e não é facilmente interrompido e reiniciado para ajustar outros tipos de depuração de código. Além disso, uma vez que está em um ambiente de produção, eu não quero chamar abort (). As questões sob investigação não são facilmente replicadas em um ambiente de não-produção. O que eu gostaria é para o programa, quando detecta certas questões, para produzir um dump de memória por conta própria, de preferência com informações suficientes para mudar o nome do arquivo e, em seguida, continuar.

Foi útil?

Solução

void create_dump(void)
{
    if(!fork()) {
        // Crash the app in your favorite way here
        abort() || (*((void*)0) = 42);
    }
}

Fork o processo, em seguida, bater a criança - que vai dar-lhe um instantâneo quando quiser

Outras dicas

Outra forma seria usar a biblioteca Google Coredumper . Isso cria um resultado semelhante ao garfo + abort técnica, mas joga mais agradável com aplicativos multithreaded (suspende os tópicos para um pouco antes de se bifurcar para que eles não fazem uma confusão na criança).

Exemplo:

    #include <google/coredumper.h>
    ...
    WriteCoreDump('core.myprogram');
    /* Keep going, we generated a core file,
     * but we didn't crash.
     */

Sun descreve como obter um arquivo core no Solaris, HP-UX, Redhat e Windows aqui .

Solaris tem o programa gcore. HP-UX podem tê-lo. Caso contrário, use gdb e sua commmand gcore. Windows tem win-dbg-root \ tlist.exe e win-dbg-root \ adplus.vbs

Você realmente quer um núcleo, ou apenas um stacktrace? Se tudo que você quer é um stacktrace você poderia dar uma olhada no opensource aqui e tentar integrar o código de lá, ou talvez apenas chamá-lo a partir da linha de comando é suficiente.

Eu acredito que algum código no projeto gdb também pode ser útil.

Outra acho que você pode querer fazer é usar gdb para anexar a um processo em execução.

$ gdb /path/to/exec 1234 # 1234 is the pid of the running process

O código fonte para produzir um dump de memória está em 'gcore', que é parte do pacote gdb.

Além disso, a Sun tem gcore .

Além disso, você tem que ter um processo separado de executar o dump de memória, como o atual processo deve ser suspenso. Você encontrará os detalhes na fonte gcore, ou você pode simplesmente executar gcore de sua plataforma com o seu processo como alvo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top