Официальный новостной канал криптобиржи OKX | www.okx.com на русском языке.
💬 Комьюнити: t.me/okx_russian
👨💻 Поддержка: [email protected]
АДМИН: @DaniiOKX
Маркетинг: @CoffeeTrends
Last updated 2 weeks, 1 day ago
Here in simple language about TON and crypto
Founder: @metasalience
contact : @deftalk_bot
Last updated 3 months, 2 weeks ago
Канал о TON и все что с ним связано:
1. Аналитика
2. Инсайды
3. Авторское мнение
Ведро для спама: @ton_telegrambot
Бот с курсами криптовалют: @TonometerBot
Чат: @chaTON_ru
Админ: @filimono
Last updated 2 weeks, 3 days ago
Всем привет! Небольшое объявление: 3го октября в 18:30 я буду выступать на митапе Витеха. Подключайтесь онлайн или приходите лично! А кроме меня там будут: 🔦 Кирилл Кузин Бросил работу инженера-конструктора, чтобы разрабатывать на Go. Сейчас работает над…
Всем привет! Небольшое объявление: 3го октября в 18:30 я буду выступать на митапе Витеха. Подключайтесь онлайн или приходите лично! А кроме меня там будут: 🔦 Кирилл Кузин Бросил работу инженера-конструктора, чтобы разрабатывать на Go. Сейчас работает над…
Персональная запись: сегодня мне исполнился 31 год. Сегодня, как и в каждом году, в этот день и месяц, число прожитых мной лет снова сделало инкремент на единицу. Это будет небольшая персональная заметка о том, что было и возможно будет. Идея вести такой…
? runtime/debug: add SetCrashOutputПо следам прошлого бага мне тут подсказали, что в Go 1.23 нам дадут глобальную функцию для обработки паник. Однако есть два но:
1.
Функция работает только с теми паниками, которые никто не перехватил используя recover()
.
2.
Функция позволяет выбрать только куда выводить сообщение. А если точнее, в какой файловый дескриптор направить вывод.
Т.е. общая идея данной функции состоит в том, что-бы разработчик мог выбрать куда конкретно он будет писать фатальные паники при схлопывании приложения. В документации есть удобный и показательный пример. А кому интересна внутрянка, то все самое важное происходит вот тут. Число изменений минимальное - Go рантайм уже использует файловый дескриптор когда пишет текст паники, поэтому все, что мы (условно) делаем это атомарно подменяем этот самый дескриптор в функции SetCrashOutput
.
Однако для случая выше это бы никак не помогло, т.к. паника уже перехвачена с помощью recover()
во внутрянке пакета fmt
. Моя идея состояла скорее в глобальном хуке, который позволяет вклиниться в любую панику до ее обработки. Но именно для анализа, а не для остановки или восстановления т.к. для этого уже есть другие механизмы.
П.С. Спасибо Алексею Палажченко за наводку.
pkg.go.dev
debug package - runtime/debug - Go Packages
Package debug contains facilities for programs to debug themselves while they are running.
Тем временем Shieldy обезумел и не пускал никого в обсуждения. Заменен другим ботом, посмотрим как новый работник справится.
Плз, кому не лень, проверьте, что у вас получается присоединиться к дискуссии и написать сообщение.
А теперь повысим сложность для тех кому интересно:
Ядро очень чутко относится к процессу с PID 1. Оно и понятно: нет процесса — нет юзерспейса ОС. Segfault который вы видели выше, это как-раз и есть эта самая паника с точки зрения ядра. Которое ее видит и пишет в логи. Отсюда получаем неприятный момент — паника как-бы есть, но видим мы ее только потому-что наш Go процесс служит init процессом. Другая возможность увидеть эту панику это подключится к процессу через дебаггер, но с init процессом это довольно проблематично. А вот тесты в таком сценарии не особо помогают.
Я это к чему: было несколько предложений в трекере про функцию для установки глобального перехватчика на паники. Но Go Core Team с упорством каждый раз отклоняет их с фразой «не нужно, есть recover()
». Вроде и да, но вот в таких случаях нас спасает только вывод go tool objdump \-S
и знание ассемблера. И как улучшить ситуацию я, честно говоря, не знаю.
Новый материал по обновлениям в стандартной библиотеке (и не только) Go уже в работе.
А пока я его пишу, вот вам небольшая викторина навеянная недавним багом который я искал в проде.
```
init[1055]: segfault at 40 ip 00000000008ef4f8 sp 000000c000e23500 error 4 in init[400000+245f000] likely on CPU 0 (core 0, socket 0)
```
Что выведет код:
```
type MyString string
func (s MyString) String() string { return "world! " + string(s) }
func main() {
var str *MyString
fmt.Println("Hello", str)
}
```
Вопрос: может кто знает сервис который markdown переводит в понятный телеге формат? Уже несколько раз бьюсь о то, что телега не умеет нормально парсить markdown ссылки, из-за чего приходиться редактировать уже в окне набора сообщений, что очень неудобно. И ведь явно эту проблему как-то решали?
Официальный новостной канал криптобиржи OKX | www.okx.com на русском языке.
💬 Комьюнити: t.me/okx_russian
👨💻 Поддержка: [email protected]
АДМИН: @DaniiOKX
Маркетинг: @CoffeeTrends
Last updated 2 weeks, 1 day ago
Here in simple language about TON and crypto
Founder: @metasalience
contact : @deftalk_bot
Last updated 3 months, 2 weeks ago
Канал о TON и все что с ним связано:
1. Аналитика
2. Инсайды
3. Авторское мнение
Ведро для спама: @ton_telegrambot
Бот с курсами криптовалют: @TonometerBot
Чат: @chaTON_ru
Админ: @filimono
Last updated 2 weeks, 3 days ago