1
resposta

Falha ao monitorar os sites com slice - [signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x608112]

Boa noite ! Ao tentar monitorar os sites com slice estou recendo a seguinte mensagem de erro:

[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x608112]

O comando escolhiodo foi:  1
Monitorando...
Testando site  0  :  https://random-status-code.herokuapp.com/
O site  https://random-status-code.herokuapp.com/  está com problemas : / -- Status Code:  500 

Testando site  1  :  https://www.caelum.com.br
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x608112]

goroutine 1 [running]:
main.testaSite(0x692b3e, 0x19)
        /home/jorge-augusto-pinto/Documentos/cursos/golang/go/src/hello/hello.go:77 +0x52
main.iniciarMonitoramento()
        /home/jorge-augusto-pinto/Documentos/cursos/golang/go/src/hello/hello.go:70 +0x1cc
main.main()
        /home/jorge-augusto-pinto/Documentos/cursos/golang/go/src/hello/hello.go:21 +0xe6
exit status 2

Eis o meu fonte:

package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {

    exibeIntroducao()

    for {

        exibeMenu()

        comando := leComando()

        switch comando {
        case 1:
            iniciarMonitoramento()
        case 2:
            fmt.Println("Exibindo logs...")
        case 0:
            fmt.Println("Saindo do programa...")
            os.Exit(0)
        default:
            fmt.Println("Não conheço este comando !!!")
            os.Exit(-1)
        }
    }
}

func exibeIntroducao() {
    nome := "Jorge"
    versao := 1.1

    fmt.Println("Olá Sr. ", nome)
    fmt.Println("Este programa está na versão: ", versao)
}

func leComando() int {
    var comandoLido int

    // fmt.Scanf("%d", &comando)
    fmt.Scan(&comandoLido)

    // fmt.Println("O endereço da variável comando na memória é: ", &comando)
    fmt.Println("O comando escolhiodo foi: ", comandoLido)

    return comandoLido

}

func exibeMenu() {
    fmt.Println("1 - Iniciar Monitoramento")
    fmt.Println("2 - Exibir Logs")
    fmt.Println("0 - Sair do Programa")
}

func iniciarMonitoramento() {
    fmt.Println("Monitorando...")

    sites := []string{"https://random-status-code.herokuapp.com/",
        "https://www.caelum.com.br",
        "https://www.alura.com.br"}

    for i, site := range sites {
        fmt.Println("Testando site ", i, " : ", site)
        testaSite(site)
    }

}

func testaSite(site string) {
    resp, _ := http.Get(site)
    if resp.StatusCode == 200 {
        fmt.Println("O site ", site, " foi carregado com sucesso ! :D\n")
    } else {
        fmt.Println("O site ", site, " está com problemas : / -- Status Code: ", resp.StatusCode, "\n")
    }
}
1 resposta

Jorge, boa tarde!

Alguns problemas de segfault não são devidos a erros em seu programa, mas são causados pelos limites de memória do sistema que estão sendo definidos muito baixos. Normalmente, é o limite do tamanho da pilha que causa esse tipo de problema. Para verificar os limites de memória, use o comando ulimit no bash ou ksh ou o comando limit em csh ou tcsh. Tente definir o tamanho da pilha mais alto e, em seguida, execute novamente o programa para ver se o segfault desaparece.

Espero ter ajudado e bons estudos!