Каковы плюсы и минусы постоянного сбора трассировки libc?

Как говорится в вопросе, полезно ли всегда собирать программную трассировку (например, с помощью libc backtrace http://www.gnu.org/software/libc/manual/html_node/Backtraces.html) во всех функциях ошибок и обработчиках сигналов?

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


person user655617    schedule 08.01.2013    source источник


Ответы (1)


Как говорится в вопросе, полезно ли всегда собирать программную трассировку?

Да, обычно очень полезно иметь трассировку стека сбоев, когда:

  • ваш код работает в вашей собственной среде, и вы не беспокоитесь о том, что трассировка стека раскроет какие-либо секреты.
  • когда обработчик сбоя не портит дамп ядра, не зависает и т. д.

как использование обратной трассировки libc

glibc backtrace вызывает calloc при определенных условиях и небезопасен в обработчике сбоев. Это может вызвать как зависание, так и дальнейшее повреждение, упомянутое выше. Написание обработчика сбоя, который будет надежно печатать трассировку стека безопасным для асинхронных сигналов способом, довольно нетривиально.

почему тогда функции ошибок в «стандартных» приложениях не вызывают обратную трассировку?

Рассмотрим cat /no/such/file. В настоящее время производит:

cat: /no/such/file: No such file or directory

и это все, что вам действительно нужно знать. Делать этот отпечаток чем-либо еще бесполезно. Если бы у вас было много таких файлов, и cat выводил полную трассировку стека для каждого, вы бы получили много страниц вывода ошибок, и это только затруднило бы поиск реальной проблемы.

Для обработчиков фатальных сигналов (например, SIGSEGV) ответ заключается в том, что большинство «стандартных» приложений на самом деле не обрабатывают такие сигналы, а просто используют действие по умолчанию, которое создает дамп памяти.

Но если бы они поймали сигнал, вызов backtrace, backtrace_symbols или backtrace_symbols_fd из обработчика сигнала был бы в равной степени небезопасен и мог бы привести к взаимоблокировке, что намного хуже, чем просто сброс ядра. Подумайте, что произойдет, если у вас есть долго работающий скрипт с 1000 командами. Вы запускаете ее, а через неделю обнаруживаете, что она не продвинулась ни на йоту, потому что вторая команда потерпела крах и зашла в тупик, пытаясь распечатать трассировку стека сбоя.

person Employed Russian    schedule 08.01.2013
comment
Спасибо за информацию ! Мне было интересно, почему тогда функции ошибок в стандартных приложениях, таких как Coreutils, не вызывают обратную трассировку по умолчанию? - person user655617; 09.01.2013
comment
@user655617 user655617 зачем тогда функции ошибок ... не вызывать обратную трассировку? Вы имеете в виду функции ошибок (например, cat unreadable-file) или вы имеете в виду функции сбоя? В первом случае трассировка стека, скорее всего, просто добавит шума. Если последнее, я не думаю, что вы поняли, может привести к зависанию части ответа - определенно гораздо лучше вылететь без трассировки стека, чем (иногда) зависать на неопределенный срок. - person Employed Russian; 09.01.2013
comment
Хм .. Для функций ошибок: почему трассировка стека просто добавит шума? Для аварийных функций: я понимаю ваше беспокойство по поводу того, что backtrace() и backtrace_symbols() небезопасны для вызова в обработчике сигналов, но нельзя ли использовать backtrace_symbols_fd() для решения этой проблемы? - person user655617; 10.01.2013
comment
@ user655617 Я обновил ответ. backtrace_symbols_fd не безопаснее, чем backtrace. Что заставило вас думать иначе? - person Employed Russian; 10.01.2013
comment
Ну, я читал, что backtrace_symbols_fd не вызывает malloc, и поэтому может использоваться в ситуациях, когда последняя функция может дать сбой ссылка, и это также упоминалось в ссылка.. Итак, почему это тоже не безопасно? Кроме того, я предполагаю, что ioctl вызовы устройства, использующего printk, также небезопасны для обработчиков сигналов? - person user655617; 10.01.2013