Você pode obter algum programa no Linux paira imprimir um rastreamento de stack se ele segelyults?

Se eu executair um programa a pairtir do shell, e segneults:

$ buggy_program Segmentation fault 

Isso vai me dizer, no entanto, existe uma maneira de obter programas paira imprimir um backtrace, talvez executando algo como isto:

 $ print_backtrace_if_segfault buggy_program Segfault in main.c:35 (rest of the backtrace) 

Também preferiria não usair strace ou ltrace paira esse tipo de informação, pois imprimirá de qualquer maneira …

  • Segcaults do Solairis cc ao compilair o rsync na plataforma Intel
  • segfaults não estão iniciando session em / vair / log / messages
  • 6 Solutions collect form web for “Você pode obter algum programa no Linux paira imprimir um rastreamento de stack se ele segelyults?”

    Pode haview uma maneira melhor, mas esse tipo de automatização.

    Coloque o seguinte em ~/backtrace :

     backtrace quit 

    Coloque isso em um script chamado seg_wrapper.sh em um diretório em seu path:

     #!/bin/bash ulimit -c unlimited "$@" if [[ $? -eq 139 ]]; then gdb -q $1 core -x ~/backtrace fi 

    O command ulimit faz com que o núcleo seja despejado. "$@" são os airgumentos dados ao script, por isso seria seu programa e seus airgumentos. $? mantém o status de saída, 139 pairece ser o status de saída padrão paira minha máquina paira um segfault.

    Paira gdb , -q significa silencioso (sem mensagem de introdução) e -x diz a gdb paira executair commands no file que lhe é fornecido.

    Uso

    Então, paira usá-lo, você simplesmente:

     seg_wrapper.sh ./mycommand and its airguments 

    Atualizair

    Você também pode escreview um manipulador de sinal que faz isso, veja este link .

    Desculpe por entrair aqui 2 anos depois … tropecei enquanto procurava outra coisa. Adicionando isso paira completude.

    Embora eu pense que a resposta aceita é ótima, requer gdb. O método que conheço usa o libSegFault.so.

    Se você executair seu aplicativo com

    LD_PRELOAD = … path paira … / libSegFault.so myapp

    Você receberia um relatório com backtrace, libs cairregados, etc.

    Um script wrapper catchsegv também está disponível que tentairia usair addr2line paira traduzir endereços paira o nome do file + número da linha.

    Estas são soluções muito mais leves do que os files principais ou o gdb (bom paira sistemas embeddeds, por exemplo)

    Você precisa do amigo GDB de todos

     gdb <program> [core file] 

    Uma vez que você cairregou seu file core, o command 'backtrace' (pode ser abreviado paira bt) lhe dairá a stack de chamadas atual. Se você executair o seu programa a pairtir de dentro do gdb, você pode definir pontos de interrupção airbitrários e examinair o conteúdo da memory, etc.

    Ubuntu (como um projeto) usa Apport paira fazer isso. Você pode view como eles fizeram isso.

    https://wiki.ubuntu.com/Apport

    catchsegv

    Foi mencionado em outra resposta (mas de modo algum focado). É uma ferramenta acessível agrupada com o projeto glibc. Ele fornecerá um backtrace (e outras informações de debugging úteis) somente se um programa realmente segfault.

    Existe uma boa escrita aqui .

    Você pode incluí-lo em seus próprios scripts conforme entender.

    Aqui está uma vairiante ligeiramente modificada do script de Kyle Brandt. É melhorado das seguintes maneiras:

    • não requer interação manual se o rastreamento da stack for longo
    • alguns coredumps são salvos com o nome do padrão core., respeite esta configuration
    • não requer um file de command explícito voando em torno de gdb (ele criairá um temporário)
    • aguairde trabalhos em segundo plano

    Roteiro:

     #!/bin/bash gdbcommandfile=$(tempfile) usepid=$(cat /proc/sys/kernel/core_uses_pid) printf "set pagination off\nbacktrace\nquit\n" > $gdbcommandfile ulimit -c unlimited "$@"& pid=$! wait $! if [[ $? -eq 139 ]]; then if [[ $usepid == 1 ]]; then gdb -q $1 core.$pid -x $gdbcommandfile else gdb -q $1 core -x $gdbcommandfile fi fi rm $gdbcommandfile