Как сделать обратную трассировку

Добавил пользователь Евгений Кузнецов
Обновлено: 05.10.2024

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

Основные вызовы функций A и A вызывают функцию B, которая вызывает функцию C.

Если я поставлю печать на функцию C, я бы хотел, чтобы она напечатала main::A::B::C - [any parameter value for debugging] или любой другой формат.

Это поможет мне быстрее решить проблему, с которой я столкнулся.

Примечание: для тех, кто ответит мне, что вы можете поставить отпечаток на каждую функцию, как я уже сказал, много вызовов и много потоков.

Решение

Если вы используете g ++, то обратный след стека может быть получен с помощью функций backtrace или backtrace_symbols .

Задача состоит в том, чтобы перехватить содержимое трассировки стека в точке, в которой возникло исключение, а затем перенести его в место, где перехвачено исключение. Для этого вы можете использовать Boost.Exception . Создайте подкласс boost :: exception, а затем в своем конструкторе перехватите обратную трассировку стека. Позже, перехватывая исключение, вы можете распечатать трассировку или иным образом сделать ее доступной.

Другой улов в том, что имена символов C ++ будут искажены. Если вы хотите сделать их читабельными, вы можете позвонить аби :: __ cxa_demangle (опять же, специфично для g ++).

Как видно из вышесказанного, ответ зависит от платформы. Могут быть похожие решения для других компиляторов и сред выполнения.

ОТВЕТЫ

Ответ 1

Xdebug печатает таблицу backtrace об ошибках, и вам не нужно писать какой-либо PHP-код для его реализации.

Даунсайд вам нужно установить его как расширение PHP.

Ответ 2

My script для установки обработчика ошибок, который создает обратную трассировку:

Предостережение: бессильно повлиять на различные 'PHP Fatal Errors', поскольку Zend в своей мудрости решил, что они игнорируют set_error_handler() . Таким образом, вы все равно получаете бесполезные ошибки конечного местоположения с ними.

Ответ 3

Ошибка PHP

Это лучший отчет об ошибках для PHP, написанный на PHP. Никаких дополнительных расширений не требуется!

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

Все, что вам нужно сделать, это включить один файл и вызвать функцию (в начале кода), например

PHP Error | Improve Error Reporting for PHP - screenshot of backtrace
PHP Error | Improve Error Reporting for PHP - screenshot of backtrace
PHP Error | Improve Error Reporting for PHP - screenshot of backtrace

Отладка PHP класса

Полный класс PHP-отладчика, с поддержкой исключений, ошибок, предупреждений (от пользователя), строк кода и флагов выделения.

Обработка ошибок в PHP

В приведенном ниже примере показано, как обрабатывать внутренние исключения, вызывая ошибки и обрабатывая их с помощью определенной пользователем функции:

Короткий путь (PHP):

Более длинный путь (PHP):

Примечание. Одновременно может быть только одно исключение ошибки. Когда вы вызываете функцию set_error_handler(), она возвращает имя старого обработчика ошибок. Вы можете сохранить это и вызвать его самостоятельно из вашего обработчика ошибок, что позволит вам иметь несколько обработчиков ошибок.

XDebug

Для более продвинутого решения вы можете использовать расширение XDebug для PHP.

По умолчанию, когда загружен XDebug, он должен автоматически показывать вам обратную трассировку в случае любой фатальной ошибки. Или вы выполняете трассировку в файл (xdebug.auto_trace), чтобы получить очень большую обратную трассировку всего запроса, или выполняете профилирование (xdebug.profiler_enable) или другие параметры. Если файл трассировки слишком большой, вы можете использовать xdebug_start_trace() и xdebug_stop_trace() для выгрузки частичной трассировки.

Монтаж

На Mac (с Homebrew):

Пример конфигурации шахты:

Drupal 6 & 7

С включенным Devel:

Выше функция будет записывать следы каждой ошибки во временный файл (по умолчанию /tmp/drupal_debug.txt ).

Или найдите файл с помощью: drush eval "echo file_directory_temp(). '/drupal_debug.txt' .

Без включения var_dump(debug_backtrace()); используйте подход старой школы: var_dump(debug_backtrace()); вместо dd() .

Ответ 4

Я просто попытался установить переменную сеанса, содержащую содержимое debug_backtrace() в строке нарушения, а затем распечатать ее с помощью register_shutdown_function(). Работал как шарм.

Ответ 5

Вы можете использовать debug_backtrace

Ответ 6

В качестве расширений php debug существует Xdebug и PHP DBG. У каждого есть свои преимущества и недостатки.

Ответ 7

Ошибка PHP даст вам трассировку стека для ваших ошибок и намного красивее, чем xDebug.

Он также будет работать и для ajax-запросов.

Ответ 8

Вот как вы это делаете:

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

Ответ 9

Ответ 10

set_error_handler() + debug_backtrace() + debug_print_backtrace() в PHP5

Ответ 11

Если вы не можете установить отладчик, воспользуйтесь этой функцией, которая окружает фатальную ошибку, чтобы получить "фатальный стек". Проверьте приведенный ниже код и пример, который лучше объясняет, как его использовать:

Вот пример того, как его использовать:

Наконец, чтобы прочитать содержимое журнала.

Надеюсь, что это поможет!

Ответ 12

PHP DeBugger также выполняет обратную трассировку, аналогичную ошибке PHP с большим количеством опций.

Если вы хотите, вы можете легко сделать свой собственный с помощью set_error_handler и debug_backtrace

Также обратите внимание, что для внутренних стеков в backtrace некоторые из ключей не будут установлены. Обязательно проверьте, существует ли ключ до того, как вы что-то сделаете с ним, если у вас есть все ошибки:)

Трассировка маршрута

Во время трассировки происходит отправка пакетов данных между локальным компьютером и сервером. Это помогает проследить путь прохождения запроса к серверу и определить, на каком этапе происходит обрыв. Выполнить трассировку довольно легко.

1. Запустите команду cmd: Win+R > пропишите cmd > ОК.

2. В открывшейся командной строке введите tracert Х.Х.Х.Х (где Х.Х.Х.Х – это IP-адрес сервера или домен) и нажмите Enter.

* * * Превышен интервал ожидания для запроса.

Но даже в таком случае пока не время для выводов – эта запись может означать как потерю пакетов, так и то, что узел сети просто закрыт настройками безопасности. Иногда провайдеры специально настраивают узлы так, чтобы они не отвечали на трассировочные пакеты, дабы снизить нагрузку. Чтобы точно узнать, действительно ли происходит обрыв, и, если да, то где именно, нужно пропинговать каждый из узлов. При трассировке мы получили IP каждого из них, а значит, можем перейти к пингу.

Пинг промежуточных узлов

Пинг предназначен для проверки целостности и качества соединений. Выполнить его тоже несложно. При этом запустить пинг нужно ко всем промежуточным узлам в отдельных окнах. Так непосредственно в момент обрыва связи будет видно, на каком узле происходят потери пакетов и насколько продолжительны эти обрывы.

В ОС Windows по умолчанию передается только четыре пакета, чего недостаточно, если проблема проявляется кратковременно. Поэтому нужно снять это ограничение параметром -t (чтобы потом остановить обмен пакетами, нажать CTRL+C).

Теперь по порядку.

1. Запустите команду cmd: Win+R > пропишите cmd > ОК.

2. В открывшейся командной строке введите ping -t Х.Х.Х.Х (где Х.Х.Х.Х – это адрес одного из промежуточных узлов, которые мы узнали при трассировке) и нажмите Enter.

В нашем случае при трассировке мы выявили десять узлов, а значит, и пинг нужно выполнить десять раз в десяти отдельных окнах.

Полезно!
Если вам нужно постоянно отслеживать качество соединения, для Windows можно воспользоваться удобной программой PingPlotter.

Итак, пингуем – в десяти отдельных окнах командной строки вводим команды с IP-адресами узлов, которые мы выявили при трассировке. В нашем случае будут такие команды:

ping -t 10.1.1.1
ping -t 193.151.89.254
ping -t 85.195.75.129
ping -t 213.248.79.29
ping -t 62.115.139.50
ping -t 62.115.120.8
ping -t 62.115.153.215
ping -t 108.170.251.129
ping -t 66.249.94.135
ping -t 216.58.208.46

Что дальше? Запустив пинг всех узлов, оставьте его включенным и занимайтесь своими делами до следующего обрыва. Как только он случится, вернитесь к окнам пинга, чтобы выявить, кто виноват и что делать.

На чьей стороне ошибка?

Кто виноват – ясно, теперь нужно понять, что делать в конкретных ситуациях.

1. Последний узел. Если последний узел сначала пинговался нормально (некоторые Windows-машины вообще не отвечают на пинг, это задается в настройках брандмауэра)…

В этом случае зайдите в панель управления, запустите консоль и войдите в операционную систему, чтобы разобраться, почему сервер не работает. Если окажется, что операционная система зависла, перезагрузите сервер.

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

Бонус!

Ну, а чтобы вам было совсем уж комфортно, мы тут подобрали утилиты, с которыми можно делать трассировку и пинг промежуточных узлов одним простым движением без запуска пятнадцати различных окон.

Для ОС семейства Windows такую оптимизацию проводит утилита Winmtr. Она не нуждается в установке и готова к использованию сразу после распаковки из архива.

Распаковали, запустили, что дальше?

В поле Host укажите конечный сервер, с которым будет проверяться соединение, и нажмите Start:

В нашем примере видна трассировка маршрута и все промежуточные узлы. При этом к каждому из них направляются ICMP-пакеты, по которым можно определить качество связи.

Собственно, в этом и заключается главное преимущество утилиты – ее вывод постоянно обновляется, это позволяет собирать статистику, отслеживать средние показатели, тенденции и какие-либо изменения качества сети.

Раз мы проверяем соединение с сервером, нас интересуют столбцы Sent (отправлено пакетов) и Recv (получено пакетов). Если значения в этих столбцах не совпадают, значит, качество связи с узлом ухудшилось. Что делать? Обратиться в соответствующую техподдержку.

Столбец Loss поможет просмотреть динамику потерь в процентном соотношении.

Также утилита позволяет копировать текст в удобных форматах (.txt и .html) в буфер обмена (Copy to clipboard) или в отдельный файл (Export).

Двойной щелчок по промежуточному узлу позволит получить дополнительную информацию о нем.

Важно знать!

Для детализации проблемы специалисты техподдержки могут запросить дополнительные пинги с особыми настройками. Для этого достаточно внести их в окошке Options, которое позволит указать:

  1. Interval (sec) – время обновления данных в секундах.
  2. Max host in LRU list – максимальное количество хостов (или IP-адресов, если не активна опция Resolve names) до конечной точки.
  3. Ping size (bytes) – размер ICMP-пакета.
  4. Resolve names – возможность преобразовать IP-адрес в имя хоста.

А что же линуксоиды?

Для ОС семейства Linux утилита называется просто MTR. Если ее нет в вашей операционной системе, установить ее можно одним из следующих способов:

$ apt-get install mtr

$ yum install mtr

У MTR такой же функционал, как у Winmtr, а также схожий графический интерфейс. Запустить утилиту можно командой:

где X.X.X.X – это IP-адрес конечного сервера или имя хоста.

В данном случае интересуют следующие столбцы:

  • Loss % – процент потерянных пакетов между компьютером-отправителем и промежуточными узлами.
  • SNT – общее количество отправленных пакетов.

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

Отдельно отметим возможность запуска утилиты в текстовом (консольном) режиме. Для этого достаточно добавить опцию -t или --curses:

mtr --curses tucha.ua

Рассмотрим еще несколько важных опций MTR, которые могут быть крайне полезны в процессе диагностики сети.

Запускает режим отчета, в котором MTR обработает заданное количество циклов (определенных опцией -c), а затем отобразит статистику и автоматически завершит работу. Этот режим полезен для сбора статистики о качестве сети.

-c COUNT или --report-cycles COUNT

Позволяет задать количество циклов, после которых MTR завершит работу.

-p BYTES или --psize BYTES

Устанавливает размер пакетов в байтах.

-i SECONDS или --interval SECONDS

Задает интервал между отправляемыми пакетами.

Разрешает не использовать DNS, отображает IP-адреса узлов.

-a X.X.X.X или --address X.X.X.X

Позволяет указать адрес интерфейса компьютера, с которого будут отправляться ICMP-запросы.

Разумеется, команды в консоли дают более точный результат, поскольку фиксируют даже единичные потери пакетов (короткие обрывы), но Winmtr и MTR компактные и более удобны в использовании. А на чем остановить свой выбор, решать только вам. :)

Вот, собственно, и все, кто виноват – выяснили, что делать – тоже. :) Надеемся, материал был вам полезен, а если у вас остались дополнительные околооблачные вопросы, обращайтесь к нам за грамотной консультацией 24×7.

php использует метод обратной трассировки отладки для отслеживания вызовов кода

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

phpиз debug_backtrace Метод может отслеживать вызов кода для облегчения отладки кода.

описание метода debug_backtrace

Создать обратную трассировку

параметр

options

limit
Этот параметр может использоваться для ограничения количества возвращаемых кадров стека, значение по умолчанию (limit = 0), и возвращаются все кадры стека.

возвращаемое значение

Вернуть массив, содержащий множество ассоциативных массивов, возможные элементы для возврата:

Пример

Чтобы получить информацию о пользователе и информацию о пользователе для заказа, вызывается процесс index-> ​​order-> user-> message, и, наконец, возвращается отсортированная информация.

использовать DEBUG_BACKTRACE_IGNORE_ARGS Args (параметры вызова метода) игнорируются

index.php

order.php

user.php

message.php

Запускаем index.php, выводим

Вы можете видеть, что вызывающий процесс

1.index.php
line 8
class Order
function get_order
args int 1000000

2.order.php
line 14
class User
function get_user
args int 1001

Интеллектуальная рекомендация


Расширенные знания MySQL (четыре) - Объяснение

Предисловие: объяснение (план выполнения) с использованием ключевого слова объяснения может имитировать оптимизатор для выполнения операторов запроса SQL, чтобы знать, как MySQL обрабатывает оп.


Клавиатура IOS закрывает влияние на опыт работы

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


Постоянная высокопроизводительная база данных Redis Alibaba Cloud NVM

задний план Как простая и эффективная база данных K / V с открытым исходным кодом, Redis может использоваться в различных сценариях, таких как кэширование памяти и постоянное хранение, для обслуживани.


docker (2) образ докера

оглавление Один рывок Два бега Механизм песочницы Три зеркала списка 3.1 Объем зеркала 3.2 Свисающее зеркало 3.3 Зеркальное отображение среднего слоя Четыре удаления зеркала 4.1 Без тегов и удалено 4.


Как добавить платную функцию чтения для веб-сайта WordPress

Вам также может понравиться

"Введение в ACM" Учебное пособие по базовому вводу и выводу системы обучения ACM Blue Bridge Cup

"Введение в ACM" Учебное пособие по базовому вводу и выводу системы обучения ACM Blue Bridge Cup Прежде чем познакомить вас с системой OJ на тренировочной площадке, позвольте мне сначала пре.

Android8.1 Camera2 слайд левый модуль, настройки слайд вправо

Android8.1 Camera2 слайд левый модуль, настройки слайд вправо 1. Измените GestureManager, скользящий класс управления жестами host/src/com/mediatek/camera/gesture/GestureManager.java Во-вторых, в Came.


Android humanoid client (v5.7.1) - выпадающий список новых вещей (список фильтров)


RobotFramework подключается к базе данных MySQL с помощью база данных

Во-первых, RobotFramework Connection MySQL База данных 1, установить базы данных пользователя, Pymysql Выполните: PIP Установить RobotFramework-databaseLibrary CMD Команда выполнения: PIP Установка Py.

Читайте также: