Wget segfault --- como sei qual site está causando isso?

3

Estou tentando espelhar um site localmente. No entanto, tenho encontrado uma falha de segmentação em algum ponto consistente no download, em um domínio diferente do site que estou segmentando (provavelmente devido a --page-requisites ).

2018-04-09 04:58:32 (346 KB/s) - './not-website.com/2017/06/28/xyz/index.html' saved [145810]

29247 Segmentation Fault      (core dumped) wget --directory-prefix="${DL_ROOT}" --recursive --page-requisites --span-hosts --tries="${TRIES_NUM}" --timeout="${TIMEOUT_NUM}" --reject="*.tar" --convert-links --adjust-extension --continue --no-check-certificate "http://website.com/"

Como resultado, eu assumo que a falha de segmentação é devida a um wget tentando baixar um site específico, mas falhando.

No entanto, a mensagem de erro parece não me dizer qual endereço o wget está falhando. Só me diz o último download bem sucedido. Como posso descobrir onde / por que wget falha com este segfault?

Existe um ficheirocore de 55M% que o erro parece referenciar em (core dumped) , mas não é em texto simples. É a informação que eu preciso lá, e como faço para extrair isso?

Eu testei isso em distros (Solaris, Debian, Raspbian) e esse segfault é consistente e sempre depois do mesmo endereço ( not-website.com/... na mensagem de erro acima).

Estou usando o comando:

$ wget \
    --directory-prefix="${DL_ROOT}" \
    --recursive \
    --page-requisites \
    --span-hosts \
    --tries="${TRIES_NUM}" \
    --timeout="${TIMEOUT_NUM}" \
    --reject="*.tar" \
    --convert-links \
    --adjust-extension \
    --continue \
    --no-check-certificate \
  "http://website.com/"

Informações adicionais

É um site grande, com bastante mídia. No ponto de falha, o tamanho do diretório baixado é de cerca de 252M.

Testado em:

GNU Wget 1.18 built on solaris2.10.

-cares +digest -gpgme +https +ipv6 -iri +large-file -metalink -nls 
+ntlm +opie -psl +ssl/openssl 

e

GNU Wget 1.18 built on linux-gnu.

-cares +digest -gpgme +https +ipv6 +iri +large-file -metalink +nls 
+ntlm +opie +psl +ssl/gnutls

e

GNU Wget 1.16 built on linux-gnueabihf.

+digest +https +ipv6 +iri +large-file +nls +ntlm +opie +psl +ssl/gnutls
    
por ning 08.04.2018 / 23:59

1 resposta

1

Falha de Segmentação significa que o programa, neste caso, wget, tentou acessar um endereço de memória inválido e, portanto, foi finalizado pelo kernel. Isso normalmente acontece devido a um erro do programa, portanto, embora seja bastante provável que ele esteja sendo acionado por um site ou página da Web específicos (considerando que você parece conseguir reproduzi-lo de maneira bastante consistente, em várias plataformas, no mesmo ponto), Ainda é provável que você tenha exposto um bug no próprio wget.

Para descobrir onde no wget a falha de segmentação está acontecendo, você pode usar o programa gdb (depurador GNU) para obter um rastreamento de stack de wget no momento em que ele falhou, o que é possível já que você tem um core Arquivo. (Um dump principal é uma cópia da imagem do programa em execução no momento em que foi terminado devido a uma operação inválida, como uma falha de segmentação.)

Para fazer isso, use o seguinte comando:

$ gdb wget core

O qual iniciará o depurador no binário wget (do caminho) e restaurará o arquivo core (no diretório atual) como a imagem do programa em execução.

gdb imprimirá algumas informações sobre o programa e fornecerá um aviso:

$ gdb wget core
GNU gdb (GDB) 7.9
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
...
Core was generated by 'wget --directory-prefix=... --recursive --page-requisites --span-hosts --tries=... --timeout=... --reject=*.tar --convert-links --adjust-extension --continue --no-check-certificate http://website.com/'.
Program terminated with signal SIGSEGV, Segmentation Fault.
(gdb) _

Nesse ponto, você pode usar o comando bt (abreviação de "backtrace") para mostrar o que estava sendo executado no momento em que o programa falhou. Que geralmente é um bom lugar para começar a procurar o bug.

Por exemplo, você pode ver algo assim:

(gdb) bt
#0  0x00007f5371206363 in __select_nocancel () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x0000559e5acbf21c in select_fd ()
#2  0x0000559e5acf0bde in wgnutls_poll ()
#3  0x0000559e5acbf3a2 in poll_internal ()
#4  0x0000559e5acbf6ed in fd_peek ()
#5  0x0000559e5ace423d in fd_read_hunk ()
#6  0x0000559e5acd5ef9 in gethttp ()
#7  0x0000559e5acd9b26 in http_loop ()
#8  0x0000559e5ace53c8 in retrieve_url ()
#9  0x0000559e5ace273b in retrieve_tree ()
#10 0x0000559e5acbe67d in main ()

Você pode então sair do gdb com o comando q (for "quit"):

(gdb) q

Geralmente é útil se você tiver os "símbolos de depuração" instalados. Essas são as informações geradas pelo compilador para depuração de binários, que geralmente são removidos para binários instalados em um sistema, portanto, eles são menores em tamanho. Essas informações podem ser salvas em um local alternativo (geralmente em /usr/lib/debug ) que pode ser localizado por gdb ao tentar depurar um binário.

Com essa informação presente, seus backtraces normalmente terão mais informações anexadas a eles, como o nome de todas as funções internas.

No Debian, você pode instalar as informações de depuração do wget com o seguinte comando:

$ sudo apt-get install wget-dbgsym

Você também pode querer instalar os símbolos de depuração para o glibc:

$ sudo apt-get install libc6-amd64-dbgsym

Dito isto, antes de começar a ver por que o wget travou, você pode querer experimentar a última versão do wget, que parece ser a versão 1.9.4 que você pode baixar aqui . Esse é um pacote de código-fonte, portanto, talvez seja necessário criar a partir de fontes para que ele funcione em seu sistema.

Isso ocorre porque uma falha de segmentação é normalmente causada por um bug, e é bem possível que esse bug já tenha sido corrigido no wget e a correção esteja presente na versão mais recente.

Caso você tenha o mesmo problema na versão mais recente, considere a possibilidade de obter um arquivo principal e usar o gdb para obter um backtrace. Em seguida, informe o bug para os mantenedores, para que eles possam resolvê-lo.

Caso seja corrigido no último wget 1.9.4, mas ele existe em uma versão do Debian que você está usando, considere relatar isso ao Debian, para que eles possam ter a chance de retroceder o patch para sua versão do wget.

Há também um novo projeto chamado wget2 , parece que eles estão tentando substituir o wget por uma nova base de código. Você pode querer verificar se esta funciona ou não ... Parece que o Debian recente vem com o nome "wget2".

Espero que esses ponteiros sejam úteis também!

    
por 09.04.2018 / 06:07