Stack trace
1. Получение стек-трейса
В языке программирования Java у программиста есть очень много способов получить информацию о том, что сейчас происходит в программе. И это не просто слова.
Например, программы на языке C++ после компиляции превращаются в один большой файл машинного кода и все, что во время выполнения доступно программисту, — это адрес куска памяти, который содержит машинный код, который сейчас выполняется. Не густо, скажем так.
В Java же, даже после компиляции, классы остаются классами, методы и переменные никуда не деваются, и у программиста есть много способов получить данные о том, что сейчас происходит в программе.
Стек-трейс
Например, в любой момент работы программы можно узнать класс и имя метода, который сейчас выполняется. И даже не одного метода, а получить информацию о всей цепочке вызовов методов от текущего метода до метода main() .
Список, состоящий из текущего метода, метода, который его вызвал, его вызвавшего метода и т.д., называется stack trace . Получить его можно с помощью команды:
Можно записать ее и в две строки:
Статический метод currentThread() класса Thread возвращает ссылку на объект типа Thread , который содержит информацию о текущей нити (о текущем потоке выполнения). Подробнее о нитях вы узнаете в 17 и 18 уровнях квеста Java Core .
У этого объекта Thread есть метод getStackTrace() , который возвращает массив элементов StackTraceElement , каждый из которых содержит информацию об одном методе. Все элементы вместе и образуют stack trace .
Код |
---|
Вывод на экран |
Как мы видим по выводу на экран, в приведенном примере метод getStackTrace() вернул массив из трех элементов:
- Метод getStackTrace () класса Thread
- Метод test () класса Main
- Метод main () класса Main
Из этого стек-трейса можно сделать вывод, что:
- Метод Thread.getStackTrace() был вызван методом Main.test() в строке 11 файла Main.java
- Метод Main.test() был вызван методом Main.main() в строке 5 файла Main.java
- Метод Main.main() никто не вызывал — это первый метод в цепочке вызовов.
Кстати, на экране отобразилась только часть всей имеющийся информации. Все остальное можно получить прямо из объекта StackTraceElement
2. StackTraceElement
Класс StackTraceElement , как следует из его названия, создан для того, чтобы хранить информацию по одному элементу stack trace — т.е. по одному методу из StackTrace .
У объектов этого класса есть такие методы:
Метод | Описание |
---|---|
Возвращает имя класса | |
Возвращает имя метода | |
Возвращает имя файла (в одном файле может быть много классов) | |
Возвращает номер строки в файле, в которой был вызов метода | |
Возвращает имя модуля (может быть null ) | |
Возвращает версию модуля (может быть null ) |
С их помощью можно получить более полную информацию о текущем стеке вызовов:
Код | Вывод на экран | Примечание |
---|---|---|
имя класса имя метода имя файла номер строки имя модуля версия модуля имя класса имя класса |
3. Стек
Что такое Stack Trace вы уже знаете, а что же такое сам Stack (Стек)?
Стек — это структура хранения данных, в которую можно добавлять элементы и из которой можно забирать элементы. Причем брать элементы можно только с конца: сначала последний добавленный, потом — предпоследний, и т.д.
Само название Stack переводится с английского как «стопка» и очень похоже на стопку бумаги. Если вы положите на стопку бумаги листы 1, 2 и 3, взять вы их сможете только в обратном порядке: сначала третий, затем второй, а только затем первый.
В Java даже есть специальная коллекция с таким поведением и таким же названием — Stack. Этот класс в своем поведении очень похож на ArrayList и LinkedList . Однако у него есть еще методы, которые реализуют поведение стека:
Методы | Описание |
---|---|
Добавляет элемент obj в конец списка (наверх стопки) | |
Забирает элемент с верха стопки (высота стопки уменьшается) | |
Возвращает элемент с верха стопки (стопка не меняется) | |
Проверяет, не пуста ли коллекция | |
Ищет объект из коллекции, возвращает его index |
Код | Содержимое стека (вершина справа) |
---|
Стек используется в программировании довольно часто. Так что это полезная коллекция.
Источник
Stack trace file android
Android Remote Stacktrace: Improved
This project is fork of Android Remote Stacktrace which adds a number of important features:
- Customizable interface for handling stacktraces
- Behaves better with the filesystem by saving stacktraces to their own directory, instead of your application’s root documents directory
- Allows optional debug logging, which will also mark your application as a DEBUG build in stack traces
What follows is the original documentation for Android Remote Stacktrace, with small modifications for the few API changes made by me.
Client side usage
Download the latest trace.jar file found here. Drop it into your Android project and in the properties for your project add it to «Java Build Path» -> «Libraries». Alternately, check out the source of this project, import it as an Eclipse Android Library Project, and add it as a library dependency to your app.
If you use the default HttpPostStackInfoSender , you must enable internet access for your application:
In the onCreate method of your activity or in your service, you must call either public static boolean register(Context context, String url) (for the default HTTP POST behavior) or public static boolean register(Context context, final StackInfoSender stackInfoSender, final boolean debug) found in the class ExceptionHandler. Do something like this:
Or, using your own handler:
If you wish to implement your own StackInfoSender, see the javadoc documentation for the interface.
Server side installation
If you would like to store your stack traces on your own server, you will have to register the exception handler like this:
At http://your.domain/path the client side implementation will expect to find this simple PHP script, which will take three POST parameters: ‘package_name’, ‘package_version’ and ‘stacktrace’. The collected data is simply stored in a plain text file. You can extend the script to send you an email with the stack trace if you like — just uncomment the last line and change the email address.
Building the JAR
The JAR may be built by issuing the following command:
This will produce a trace.jar file.
Cleaning up is done by:
If you have problems, feel free to drop me a mail at mads.kristiansen@nullwire.com.
Thanks to these people, who contributed with code changes and/or bug reports.
The MIT License
Copyright (c) 2009 Mads Kristiansen, Nullwire ApS
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the «Software»), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Источник
How to Get meaningful stack trace in Android #984
Comments
Tan2NT commented Jul 18, 2018 •
I have built my project with Asan, compile with -fsanitize=address -fno-omit-frame-pointer -O1
But the log does not show the file and function where the crash occur.
I see this guide how to get stack trace for asan: https://github.com/google/sanitizers/wiki/AddressSanitizerCallStack
Is this link is for Android too?
What detail should i do?
Below is the log cat of crash:
07-18 20:33:00.952: I/(13918): ==13918==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x49933954 at pc 0xa4dcb5b4 bp 0x9e9ff018 sp 0x9e9ff010
07-18 20:33:00.952: I/(13918): READ of size 4 at 0x49933954 thread T324 (Thread-379)
07-18 20:33:00.962: W/System.err(13918): remove failed: ENOENT (No such file or directory) : package.myapp/shared_prefs/com.google.android.gms.appid.xml.bak
07-18 20:33:00.987: I/(13918): #0 0xa4dcb5b3 (/data/app/package-1/lib/arm/libGame.so+0x10245b3)
07-18 20:33:00.992: I/(13918): #1 0xa4dcbbe7 (/package/lib/arm/libGame.so+0x1024be7)
07-18 20:33:00.992: I/(13918): #2 0xa4dd33d7 (/package/lib/arm/libGame.so+0x102c3d7)
07-18 20:33:00.992: I/(13918): #3 0xa51207a3 (/package/lib/arm/libGame.so+0x13797a3)
07-18 20:33:00.992: I/(13918): #4 0xa4d670b7 (/package/lib/arm/libGame.so+0xfc00b7)
07-18 20:33:00.992: I/(13918): #5 0xac18d617 (/package/lib/arm/libGame.so+0x83e6617)
07-18 20:33:00.992: I/(13918): #6 0xac18ca77 (/package/lib/arm/libGame.so+0x83e5a77)
07-18 20:33:00.992: I/(13918): #7 0xb6784e3b (/system/lib/libc.so+0x3fe3b)
07-18 20:33:00.992: I/(13918): #8 0xb675f55b (/system/lib/libc.so+0x1a55b)
07-18 20:33:00.997: D/TimaKeyStoreProvider(14724): TimaSignature is unavailable
07-18 20:33:00.997: D/ActivityThread(14724): Added TimaKeyStore provider
07-18 20:33:01.007: I/(13918): 0x49933954 is located 0 bytes to the right of 4-byte region [0x49933950,0x49933954)
07-18 20:33:01.007: I/(13918): allocated by thread T324 (Thread-379) here:
07-18 20:33:01.007: I/(13918): #0 0xb6a55077 (/system/lib/libclang_rt.asan-arm-android.so+0x82077)
07-18 20:33:01.007: I/(13918): Thread T324 (Thread-379) created by T0 (.ANMP.myapp) here:
07-18 20:33:01.007: I/(13918): #0 0xb6a2f4db (/system/lib/libclang_rt.asan-arm-android.so+0x5c4db)
07-18 20:33:01.007: I/(13918): #1 0xaeb36d3d (/package/oat/arm/base.odex+0xc34d3d)
07-18 20:33:01.012: I/(13918): SUMMARY: AddressSanitizer: heap-buffer-overflow (/package/lib/arm/libGame.so+0x10245b3)
07-18 20:33:01.012: I/(13918): Shadow bytes around the buggy address:
07-18 20:33:01.012: I/(13918): 0x093266d0: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
07-18 20:33:01.012: I/(13918): 0x093266e0: fa fa fd fd fa fa fd fa fa fa fd fd fa fa fd fa
07-18 20:33:01.012: I/(13918): 0x093266f0: fa fa fd fa fa fa fd fa fa fa fd fa fa fa 00 04
07-18 20:33:01.012: I/(13918): 0x09326700: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
07-18 20:33:01.012: I/(13918): 0x09326710: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
07-18 20:33:01.012: I/(13918): =>0x09326720: fa fa fa fa fa fa fa fa fa fa[04]fa fa fa fd fd
07-18 20:33:01.012: I/(13918): 0x09326730: fa fa fd fa fa fa fd fd fa fa fd fa fa fa fd fa
07-18 20:33:01.012: I/(13918): 0x09326740: fa fa fd fa fa fa fd fd fa fa fd fa fa fa fd fd
07-18 20:33:01.012: I/(13918): 0x09326750: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
07-18 20:33:01.012: I/(13918): 0x09326760: fa fa fd fd fa fa fd fa fa fa fd fd fa fa fd fa
07-18 20:33:01.012: I/(13918): 0x09326770: fa fa fd fa fa fa fd fa fa fa fd fa fa fa 00 04
07-18 20:33:01.012: I/(13918): Shadow byte legend (one shadow byte represents 8 application bytes):
07-18 20:33:01.012: I/(13918): Addressable: 00
07-18 20:33:01.012: I/(13918): Partially addressable: 01 02 03 04 05 06 07
07-18 20:33:01.012: I/(13918): Heap left redzone: fa
07-18 20:33:01.012: I/(13918): Heap right redzone: fb
07-18 20:33:01.012: I/(13918): Freed heap region: fd
07-18 20:33:01.012: I/(13918): Stack left redzone: f1
07-18 20:33:01.012: I/(13918): Stack mid redzone: f2
07-18 20:33:01.012: I/(13918): Stack right redzone: f3
07-18 20:33:01.012: I/(13918): Stack partial redzone: f4
07-18 20:33:01.012: I/(13918): Stack after return: f5
07-18 20:33:01.012: I/(13918): Stack use after scope: f8
07-18 20:33:01.012: I/(13918): Global redzone: f9
07-18 20:33:01.012: I/(13918): Global init order: f6
07-18 20:33:01.012: I/(13918): Poisoned by user: f7
07-18 20:33:01.012: I/(13918): Container overflow: fc
07-18 20:33:01.012: I/(13918): Array cookie: ac
07-18 20:33:01.012: I/(13918): Intra object redzone: bb
07-18 20:33:01.012: I/(13918): ASan internal: fe
07-18 20:33:01.012: I/(13918): Left alloca redzone: ca
07-18 20:33:01.012: I/(13918): Right alloca redzone: cb
07-18 20:33:01.012: I/(13918): ==13918==ABORTING
The text was updated successfully, but these errors were encountered:
Источник
Как добавить Stacktrace или параметр отладки при создании проекта Android Studio
Я пытался исследовать ошибку сборки проекта в выводе консоли следующим образом:
Я подозреваю, что это как-то связано с ошибкой «ресурс не найден». Мой вопрос: на уровне IDE, как я могу добавить —stacktrace или —debug опцию, чтобы он мог предоставить мне больше информации для отладки?
Вы можете использовать графический интерфейс, чтобы добавить эти флаги командной строки gradle из
Для пользователей MacOS это здесь
как это (добавить —stacktrace или —debug )
(Обратите внимание, что скриншот сделан до 0.8.10, этот параметр больше не в Compiler > Gradle разделе, теперь он находится в отдельном разделе с именем Compiler (Gradle-based Android Project) )
В Mac версии Android Studio Beta 1.2 ниже
Android Studio->preferences->Build, Execution, Deployment->Compiler
В Android Studios 2.1.1 параметры командной строки находятся в разделе «Сборка, выполнение, развертывание»> «Компилятор».
Что я использую для целей отладки, так это запуск задачи gradle с помощью stacktrace непосредственно в терминале. Тогда вы не повлияете на обычные компиляции.
Из корневого каталога вашего проекта через терминал вы можете использовать:
Чтобы добавить трассировку стека, щелкните Gradle в правой части экрана проекта Android;
Щелкните значок настроек; это откроет страницу настроек,
Затем нажмите компилятор
Затем добавьте команду —stacktrace или, —debug как показано;
Снова запустите приложение, чтобы получить отчет Gradle.
(отредактировано в декабре 2018 г .: Android Studio 3.2.1 и на Mac)
Для Android Studio 3.1.3 на Mac это было под
Android Studio -> Настройки -> Сборка, выполнение, развертывание -> Компилятор
а затем, чтобы просмотреть трассировку стека, нажмите эту кнопку
Для Android Studio 3.1.3 это было под
Файл -> Настройки -> Сборка, выполнение, развертывание -> Компилятор
мое решение таково:
Чтобы иметь возможность запускать параметры, как —stacktrace в команде gradle, вам нужно поместить ее в начало, например:
./gradlew —stacktrace assembleMyBuild
Если вы используете fastlane, дополнительные флаги можно передать с помощью
мое решение таково:
Чтобы увеличить максимальную кучу: нажмите, чтобы открыть Android Studio, посмотрите изображения ниже. Шаг за шагом. ANDROID СТУДИЯ v2.1.2
Нажмите, чтобы перейти к настройкам в разделе «Настроить» или «ПЕРЕЙТИ К НАСТРОЙКАМ ФАЙЛА» в верхней части Android Studio.
проверьте также компиляторы Android по ссылке, чтобы подтвердить, изменится ли он, если не увеличится до того же размера, который вы изменили из ссылки компилятора.
Примечание. Вы можете увеличить базовый размер вашей памяти и помните, что этот параметр основан на Android Studio v2.1.2.
Источник