Принудительный Go детектор тупика к гриппу sh некоторые следы - PullRequest
0 голосов
/ 29 мая 2020

Я хочу использовать пакет трассировки выполнения для отладки тупиковой ситуации путем изучения собранных трассировок. Однако, когда происходит взаимоблокировка, система вылетает без каких-либо следов. Тупиковые ситуации обнаруживаются с помощью checkdead () , где он проверяет, равно ли 0 запущенных горутин, и выдает фатальную ошибку, если да. Неустранимые ошибки (в отличие от паники) невозможно отловить и исправить. Это - это выходное сообщение, за которым следует sys.exit(1). Поэтому идея вызова StopTrace () (для гриппа sh буферов трассировки) в случае тупиковой ситуации с использованием recover() неосуществима.

Так что я подумал, может быть, я могу изменить функция checkdead () на пути к StopTrace() перед выдачей фатальной ошибки. Я имею в виду преобразование приведенного ниже фрагмента кода (из объявления checkdead () ):

...
getg().m.throwing = -1                   // do not dump full stacks
unlock(&sched.lock)                      // unlock so that GODEBUG=scheddetail=1 doesn't hang
throw("all goroutines are asleep - deadlock!")
...

в

...
getg().m.throwing = -1                   // do not dump full stacks
unlock(&sched.lock)                      // unlock so that GODEBUG=scheddetail=1 doesn't hang
StopTrace()                              // to flush trace buffers before exit
throw("all goroutines are asleep - deadlock!")
...

Однако из-за директив компиляции ( # pragmas ), которые заставляют некоторые функции не иметь барьеров для записи, приведенный выше фрагмент кода дает сбой, когда я хочу перестроить среду выполнения. Например, функция templateThread () вызывает checkdead() во время выполнения и имеет прагму //go:nowritebarriersrec, означающую, что эта функция и любая вызываемая ею функция не должны иметь барьеров для записи.

Учитывая все это, у меня есть два вопроса? - Кто-нибудь знает лучший подход о том, как заставить checkdead() грипп sh буферы трассировки перед выходом из программы? - Есть ли способ обойти директивы компиляции, чтобы избежать сборки cra sh? Однако это может привести к некорректному поведению среды выполнения. Мне просто любопытно.

ps: Я не уверен, насколько хорошо я объяснил свою проблему. Пожалуйста, дайте мне знать в комментариях, если какая-либо часть непонятна.

...