Я хочу использовать пакет трассировки выполнения для отладки тупиковой ситуации путем изучения собранных трассировок. Однако, когда происходит взаимоблокировка, система вылетает без каких-либо следов. Тупиковые ситуации обнаруживаются с помощью 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: Я не уверен, насколько хорошо я объяснил свою проблему. Пожалуйста, дайте мне знать в комментариях, если какая-либо часть непонятна.