Eu gostaria de forçar um despejo de memória em um local específico em meu aplicativo C ++.
Eu sei que posso fazer isso fazendo algo como:
int * crash = NULL;
*crash = 1;
Mas gostaria de saber se existe uma forma mais limpa?
Estou usando o Linux, a propósito.
Respostas:
Aumentar o sinal de número 6 (
SIGABRT
no Linux) é uma maneira de fazer isso (embora tenha em mente que SIGABRT não precisa ser 6 em todas as implementações POSIX, então você pode querer usar oSIGABRT
próprio valor se for qualquer coisa diferente de quick'n 'código de depuração sujo).Chamar
abort()
também causará um despejo de memória, e você pode até fazer isso sem encerrar o processo, chamandofork()
seguido porabort()
no filho apenas - consulte esta resposta para obter detalhes.fonte
ulimit -c unlimited
resposta de Suvesh Pratapa, me ajudou muito para esta resposta.Alguns anos atrás, o Google lançou a biblioteca coredumper .
Não é o que você estava pedindo, mas talvez seja ainda melhor :)
fonte
Conforme listado na página de manual do sinal , qualquer sinal com a ação listada como 'núcleo' forçará um despejo de núcleo. Alguns exemplos são:
Certifique-se de habilitar core dumps:
fonte
ulimit -c unlimited
ajudou.setrlimit(RLIMIT_CORE, &core_limits);
disponível via#include <sys/resource.h>
. Você cria uma estrutura do tiporlimit
e, em seguida, define os membrosrlim_cur
erlim_max
.fonte
abort()
diretamente?Invocar
Relacionado, às vezes você gostaria de um rastreamento de trás sem um despejo de núcleo real e permitir que o programa continue em execução: verifique as funções glibc backtrace () e backtrace_symbols (): http://www.gnu.org/s/libc/ manual / html_node / Backtraces.html
fonte
Outra maneira de gerar um dump principal:
Basta criar uma nova instância do bash e eliminá-lo com o sinal especificado. O
$$
é o PID do shell. Caso contrário, você está matando seu bash atual e será desconectado, o terminal será fechado ou desconectado.fonte
bash -c 'kill -SIGSEGV $$'
.Você pode usar kill (2) para enviar sinal.
Assim,
fonte
Às vezes, pode ser apropriado fazer algo assim:
Um problema com esta abordagem simples é que apenas um segmento será bombeado.
fonte
use essa abordagem onde quiser :)
fonte
fonte