Почему ioutil.ReadFile () зависает после вызова в цикле for? - PullRequest
1 голос
/ 26 марта 2019

Я написал функцию, которая преобразует изображение в строку base64:

func getBase64Screenshot() string {
    // Image name
    imageName := "Screenshots/screenshot.png"

    imageFileBytes, err := ioutil.ReadFile(imageName)
    handleError(err)

    // Converts file to base64 string
    encoded := base64.StdEncoding.EncodeToString(imageFileBytes)

    return encoded
}

Вышеуказанная функция вызывается в for loop, однако после некоторых итераций цикла for программа просто зависает встрока imageFileBytes, err := ioutil.ReadFile(imageName) (она не выдает ошибку, она просто прекращает работу и останавливается).

Я провел несколько экспериментов и обнаружил, что если бы я использовал изображение меньшего размера, он прошел бы через ~ 5 итерацийиз for loop перед остановкой, однако, если я сделаю снимок экрана со всем моим экраном, он пройдет только через первую итерацию for loop перед остановкой.

Мой вопрос таков: Что вызываетпрограмма для зависания, и что я могу сделать, чтобы она не зависала?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 26 марта 2019

Один из способов отладки проблемы - отправить SIGABRT в вашу работающую программу (при зависании), чтобы заставил программу завершить работу с дампом стека .

kill -ABRT <pid>
# or CTRL+Pause on Windows.

Тогда вы увидите , где программа зависла, и действительно ли она связана с вашей функцией.

2 голосов
/ 26 марта 2019

Отладка вашего кода.


Попробуйте и дайте мне знать, если это работает и для вас:
Это работает как прелесть для меня в Linux:

package main

import (
    "encoding/base64"
    "fmt"
    "io/ioutil"
    "log"
    "os"
)

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println(getBase64Screenshot()[:10])
    }
}
func getBase64Screenshot() string {
    buf, err := ioutil.ReadFile(os.Args[0])
    if err != nil {
        log.Fatal(err)
    }
    encoded := base64.StdEncoding.EncodeToString(buf)
    return encoded
}

Выход:

time go run main.go
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ

real    0m0.340s
user    0m0.369s
sys     0m0.128s
0 голосов
/ 29 марта 2019

Привет, ребята, я смог решить проблему.

Видите ли, изначально функция getBase64Screenshot(), которую я написал выше, вызывается каждые 10 секунд внутри goroutine.

* 1006.* Чтобы решить эту проблему, я реорганизовал свой код для исключения goroutine и вместо этого вызвал getBase64Screenshot() внутри бесконечного цикла:
for {
        getBase64Screenshot()
        time.Sleep(timedelayMilliseconds * time.Millisecond)
    }

Я протестировал приведенный выше код, выполнив его более 30 минутс очень большими скриншотами (размером> 1 МБ), и никогда не падал и не зависал .

Хотя я исправил проблему, с которой столкнулся, но не смог выяснитьчто именно вызвало это в первую очередь.Я приветствую любые теории относительно того, почему мой исходный код выше остановился.

...