- Stack trace в разработчике С++: что это, для чего нужен и как его использовать
- Путь автоматизатора
- Страницы
- 18 октября 2016
- Stack trace или трассировка стека в Java
- What is a stack trace, and how can I use it to debug my application errors?
- 13 комментариев:
- Что такое трассировка стека и как я могу использовать ее для устранения ошибок приложения?
- Что такое stack trace, и как с его помощью находить ошибки при разработке приложений?
- 1 ответ 1
Stack trace в разработчике С++: что это, для чего нужен и как его использовать
Стектрейс — это отладочный инструмент при разработке. В процессе выполнения программы выдает отчет о работающих стеках в выбранный момент времени, поэтому всегда есть возможность посмотреть класс и имя функции, которая выполняется прямо сейчас. Также можно посмотреть функцию , которая вызвала нужную работающую функцию , и вывести это все в виде списка. Это списки могут помочь найти функции и методы, вызвавшие ошибки в приложении.
До определенного момента стектрейс не был включен в стандарты разработки С++. Но в последнее время ситуация поменялась и отечественные разработчики тоже к тому приложили свои усилия.
Стектр е йс в С++
Что такое stack trace — вы уже знаете. Но представьте себе, что каких-то пару лет назад он не был включен в стандарт С++. В 2018-м году Российская инициативная группа разработчиков собирала мнения других программистов по поводу стектрейс в С++ и донесла их в Международный комитет по стандартизации. Четко обосновав, что принятые изменения позволят упростить разработку на С++ и добавят в этот язык больше логики.
Работая над большими проектами на С++, часто возникает потребность узнать , откуда берет начало та или иная функция. Допустим , нужная нам функция вызывается только после возникновения ошибки, тогда не лишним было бы узнать , какие «вызовы» вызвали ошибку и нужную функцию.
Самым простым методом было бы применить отладчик , и остановить его работу в нужном месте и просмотреть стек. Но в некоторых сценариях отладки это сделать невозможно, например :
когда необходимо просмотреть стек с устройства, где нет возможности наладить отладчик;
когда невозможно «внешнее» вмешательство в отлаживаемое приложение.
В этих случаях возможно получать стек только в процессе выполнения программы. Тут и может помочь технол о гия стектр е йс. Но для этого нужно внести классы для просмотра стека прямо в стандарт С++. Именно это и инициировали русские разработчики.
Это не значит , что до сих пор никак это нельзя было сделать. До внедрения стектр е йс в С++ это все делалось очень «громоздкими» методами такими как :
использова ние большо го обили я форматов;
использова ние компилятор ов и платфор м ;
подключ ение различны х библиоте к и др.
По сути , эти действия только добавляли сложности в проект. А с внедрением стектр е йс стало возможным все это сделать двумя строчками кода.
Плюсы использования стектр е йс в С++
Стектр е йс в С++ принес с собой определенные «облегчения» при отладке программ:
больше не нужно ограничивать себя одной определенной платформой;
отпадает зависимость от определенного компилятора — теперь можно использовать многие компиляторы, которые поддерживают стандарт стектр е йс в С++;
больше не нужно переживать по поводу формата отладочной информации;
отпадает зависимость от использования определенных библиотек;
Stack trace — это то , что облегчит вашу разработку и отладку приложений на языке С++. Стектр е йс — это достаточно новая технология для С++ , и со временем он будет только развиваться и дополняться новыми возможностями. К примеру , ближайшее дополнение — это добавление способности переноса стектре й сов между разными машинами.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Источник
Путь автоматизатора
Блог о тестировании, автоматизации тестирования и Java
Страницы
18 октября 2016
Stack trace или трассировка стека в Java
What is a stack trace, and how can I use it to debug my application errors?
13 комментариев:
в который раз восхищаюсь женским трудолюбием
спасибо. мне приятно что мое трудолюбие оказалось для кого-то полезным 🙂
спасибо за статью!
Спасибо за статью! 🙂
Спасибо за труд!)
You are welcome!
вот стаолкнулся сегодня с этим заданием на javarush — методика конечно поражает «разбирайся сам как хочешь»
чего я только не на придумывал пока не разобрался
в общем в двух словах — просто трекинг методов до ошибки
вот видосик- но тут только описательная часть без кода
https://www.youtube.com/watch?v=9JfCCk9vbgI
вот описание методов на полупереведеннорусском
http://spec-zone.ru/RU/Java/Docs/7/api/java/lang/StackTraceElement.html
короче создаем массив методов до ошибки:
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
методы:
stack.length; — так получаем количество методов в массиве
так можем их перебрать
for (StackTraceElement element: stack)
для инфы: номера методов в стеке
0 — getStackTrace — сам трейсер
1 — имя метода (свое имя)
2 — имя метода кто вызвал [1] — всегда2.
3 — имя метода кто вызвал [2]
4 — и т.д.
stack[2].getMethodName(); — получаем имя вызывающего метода
stack[2].getLineNumber(); — получаем строку в вызвавшем методое
stack[2].getClassName(); — получаем имя класса
Не «отбрасывайте» нижние строки. Из них видно, что IDE запускает из своего класса свой же main, который, используя рефлексию (посмотрите на методы invoke и reflect из sun-библиотеки), в свою очередь, запускает ваш main.
Источник
Что такое трассировка стека и как я могу использовать ее для устранения ошибок приложения?
Иногда, когда я запускаю свое приложение, оно выдает мне ошибку, которая выглядит следующим образом:
Люди называют это «следом стека». Что такое трассировка стека? Что он может сказать мне об ошибке, которая происходит в моей программе?
Об этом вопросе — довольно часто я вижу вопрос, когда начинающий программист «получает ошибку», и они просто вставляют свою трассировку стека и некоторый случайный блок кода, не понимая, что такое трассировка стека или как они могут ее использовать. Этот вопрос предназначен для начинающих программистов, которым может понадобиться помощь в понимании значения трассировки стека.
Проще говоря, трассировка стека — это список вызовов методов, которые приложение находилось в середине, когда было сгенерировано исключение.
Простой пример
С помощью примера, приведенного в вопросе, мы можем точно определить, где было выброшено исключение в приложении. Давайте посмотрим на трассировку стека:
Это очень простая трассировка стека. Если мы начнем с начала списка «at . », мы можем сказать, где произошла наша ошибка. Мы ищем самый верхний вызов метода, который является частью нашего приложения. В данном случае это:
Чтобы отладить это, мы можем открыть Book.java и посмотреть на строку 16 , которая:
Это будет означать, что что-то (вероятно title ) находится null в приведенном выше коде.
Пример с цепочкой исключений
Иногда приложения перехватывают исключение и повторно генерируют его как причину другого исключения. Это обычно выглядит так:
Это может дать вам трассировку стека, которая выглядит следующим образом:
То, что отличается от этого, это «Причины». Иногда исключения будут иметь несколько разделов «Причины». Для них обычно требуется найти «основную причину», которая будет одной из самых низких «причинных» секций в трассировке стека. В нашем случае это:
Опять же , с этим исключением мы хотели бы посмотреть на линию 22 из , Book.java чтобы увидеть , что может привести NullPointerException здесь.
Более сложный пример с библиотечным кодом
Обычно трассировки стека намного сложнее, чем два приведенных выше примера. Вот пример (он длинный, но демонстрирует несколько уровней связанных исключений):
В этом примере намного больше. Что нас больше всего беспокоит, так это поиск методов, взятых из нашего кода , которые будут в com.example.myproject пакете. Из второго примера (выше), мы сначала хотели бы найти первопричину, а именно:
Однако все вызовы методов в соответствии с этим являются библиотечным кодом. Итак, мы перейдем к «Причины» над ним и поищем первый вызов метода, происходящий из нашего кода, а именно:
Как и в предыдущих примерах, мы должны смотреть MyEntityService.java онлайн 59 , потому что именно здесь возникла эта ошибка (эта ошибка немного очевидна, что пошло не так, поскольку SQLException сообщает об ошибке, но мы ищем процедуру отладки).
Я публикую этот ответ, поэтому самый верхний ответ (при сортировке по активности) не является просто ошибочным.
Что такое Stacktrace?
Stacktrace — очень полезный инструмент отладки. Он показывает стек вызовов (т. Е. Стек функций, которые были вызваны до этой точки) в момент возникновения неперехваченного исключения (или в момент, когда трассировка стека была сгенерирована вручную). Это очень полезно, поскольку показывает не только, где произошла ошибка, но и то, как программа оказалась в этом месте кода. Это приводит к следующему вопросу:
Что такое исключение?
Исключением является то, что среда выполнения использует, чтобы сообщить вам, что произошла ошибка. Популярные примеры: NullPointerException, IndexOutOfBoundsException или ArithmeticException. Каждый из них вызывается, когда вы пытаетесь сделать что-то, что невозможно. Например, исключение NullPointerException будет выдано при попытке разыменования объекта Null:
Как я должен иметь дело со стеками / исключениями?
Сначала выясните, что вызывает исключение. Попробуйте поискать название исключения, чтобы выяснить причину этого исключения. В большинстве случаев это будет вызвано неправильным кодом. В приведенных выше примерах все исключения вызваны неправильным кодом. Так что для примера NullPointerException вы можете убедиться, что a он никогда не будет нулевым в то время. Вы можете, например, инициализировать a или включить проверку, подобную этой:
Таким образом, оскорбительная строка не выполняется, если a==null . То же самое касается других примеров.
Иногда вы не можете быть уверены, что не получите исключения. Например, если вы используете сетевое соединение в своей программе, вы не можете остановить компьютер от потери его интернет-соединения (например, вы не можете запретить пользователю отключать сетевое соединение компьютера). В этом случае сетевая библиотека, вероятно, выдаст исключение. Теперь вы должны поймать исключение и обработать его. Это означает, что в примере с сетевым подключением вы должны попытаться повторно открыть подключение или уведомить пользователя или что-то в этом роде. Кроме того, всякий раз, когда вы используете catch, всегда перехватываете только исключение, которое вы хотите перехватить, не используйте такие широкие операторы catch, как catch (Exception e) что бы поймать все исключения. Это очень важно, потому что в противном случае вы можете случайно поймать не то исключение и отреагировать неправильно.
Почему я не должен использовать catch (Exception e) ?
Давайте используем небольшой пример, чтобы показать, почему вы не должны просто перехватывать все исключения:
Этот код пытается отловить ArithmeticException причину, вызванную возможным делением, на 0. Но он также отлавливает возможное NullPointerException , которое выбрасывается, если a или b есть null . Это означает, что вы можете получить, NullPointerException но вы будете относиться к нему как к ArithmeticException и, вероятно, будете поступать неправильно. В лучшем случае вы все еще скучаете по тому, что было исключение NullPointerException. Такие вещи делают отладку намного сложнее, так что не делайте этого.
TLDR
- Выясните причину исключения и устраните его, чтобы исключение вообще не генерировалось.
Если 1. невозможно, перехватите конкретное исключение и обработайте его.
- Никогда не добавляйте try / catch, а затем просто игнорируйте исключение! Не делай этого!
- Никогда не используйте catch (Exception e) , всегда ловите определенные исключения. Это избавит вас от многих головных болей.
Источник
Что такое stack trace, и как с его помощью находить ошибки при разработке приложений?
Иногда при запуске своего приложения я получаю подобную ошибку:
Мне сказали, что это называется «трассировкой стека» или «stack trace». Что такое трассировка? Какую полезную информацию об ошибке в разрабатываемой программе она содержит?
Немного по существу: довольно часто я вижу вопросы, в которых начинающие разработчики, получая ошибку, просто берут трассировки стека и какой-либо случайный фрагмент кода без понимания, что собой представляет трассировка и как с ней работать. Данный вопрос предназначен специально для начинающих разработчиков, которым может понадобиться помощь в понимании ценности трассировки стека вызовов.
1 ответ 1
Простыми словами, трассировка стека – это список методов, которые были вызваны до момента, когда в приложении произошло исключение.
Простой случай
В указанном примере мы можем точно определить, когда именно произошло исключение. Рассмотрим трассировку стека:
Это пример очень простой трассировки. Если пойти по списку строк вида «at…» с самого начала, мы можем понять, где произошла ошибка. Мы смотрим на верхний вызов функции. В нашем случае, это:
Для отладки этого фрагмента открываем Book.java и смотрим, что находится на строке 16 :
Это означает то, что в приведенном фрагменте кода какая-то переменная (вероятно, title ) имеет значение null .
Пример цепочки исключений
Иногда приложения перехватывают исключение и выбрасывают его в виде другого исключения. Обычно это выглядит так:
Трассировка в этом случае может иметь следующий вид:
В этом случае разница состоит в атрибуте «Caused by» («Чем вызвано»). Иногда исключения могут иметь несколько секций «Caused by». Обычно необходимо найти исходную причину, которой оказывается в самой последней (нижней) секции «Caused by» трассировки. В нашем случае, это:
Аналогично, при подобном исключении необходимо обратиться к строке 22 книги Book.java , чтобы узнать, что вызвало данное исключение – NullPointerException .
Еще один пугающий пример с библиотечным кодом
Как правило, трассировка имеет гораздо более сложный вид, чем в рассмотренных выше случаях. Приведу пример (длинная трассировка, демонстрирующая несколько уровней цепочек исключений):
В этом примере приведен далеко не полный стек вызовов. Что вызывает здесь наибольший интерес, так это поиск функций из нашего кода – из пакета com.example.myproject . В предыдущем примере мы сначала хотели отыскать «первопричину», а именно:
Однако все вызовы методов в данном случае относятся к библиотечному коду. Поэтому мы перейдем к предыдущей секции «Caused by» и найдем первый вызов метода из нашего кода, а именно:
Источник