androidc打印堆栈(打印堆栈日志)
本篇目录:
1、如何在进程崩溃后打印堆栈并防止数据丢失2、ndk编写的动态库崩溃了,如何打印堆栈3、C程序中如何使用堆栈4、怎么让程序异常退出时打印堆栈信息5、手机调试Android程序出异常时不打印堆栈信息6、android如何在C++中打印调用堆栈如何在进程崩溃后打印堆栈并防止数据丢失
1、只要在程序中设置SIGSEGV的handler中,调用libc的backtrace,打出对应的堆栈信息,很快就能找到问题所在。但在Android中,bionic并不提供类似功能,而且log信息是走的loger,通过logcat才可以看到。
2、java代码中打印堆栈Java代码打印堆栈比较简单, 堆栈信息获取和输出,都可以通过Throwable类的方法实现。目前通用的做法是在java进程出现需要注意的异常时,打印堆栈,然后再决定退出或挽救。
3、可以在程序运行的过程中将logcat日志保存到一个文件,甚至可以在崩溃发生时,快速的将logcat日志保存起来,然后再进行分析,比上面的方法稍微灵活一点,而且日志可以留待以后继续分析。
ndk编写的动态库崩溃了,如何打印堆栈
1、只要在程序中设置SIGSEGV的handler中,调用libc的backtrace,打出对应的堆栈信息,很快就能找到问题所在。但在Android中,bionic并不提供类似功能,而且log信息是走的loger,通过logcat才可以看到。
2、C代码中打印堆栈C代码,尤其是底层C库,想要看到调用的堆栈信息,还是比较麻烦的。 CallStack肯定是不能用,一是因为其实C++写的,需要重新封装才能在C中使用,二是底层库反调上层库的函数,会造成链接器循环依赖而无法链接。
3、RuntimeException re = new RuntimeException();re.fillInStackTrace();Log.e(info, info, re);这个可以将对应方法的所有调用过程打出来。
4、利用Android NDK开发本地应用的时候,几乎所有的程序员都遇到过程序崩溃的问题,但它的崩溃会在logcat中打印一堆看起来类似天书的堆栈信息,让人举足无措。
C程序中如何使用堆栈
堆:顺序随意;栈:后进先出(Last-In/First-Out)。隣内存分配一个由C/C++编译的程序占用的内存分为以下几个部分:栈区、堆区、全局区(静态区)、文字常量区、程序代码区。
先从大家比较熟悉的栈说起,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。
堆栈段在程序中的作用堆栈段一般是拿来保存局部变量用的,函数调用,中断返回都需要栈的支持。良好的程序员和优美的代码不应该没有堆栈段。
在实际编程中,可以通过两种方式来实现:使用数组的形式来实现栈,这种栈也称为静态栈;使用链表的形式来实现栈,这种栈也称为动态栈。
怎么让程序异常退出时打印堆栈信息
java代码中打印堆栈Java代码打印堆栈比较简单, 堆栈信息获取和输出,都可以通过Throwable类的方法实现。目前通用的做法是在java进程出现需要注意的异常时,打印堆栈,然后再决定退出或挽救。
一般在catch到异常的时候,不要使用e.printStackTrace()来打印异常信息。我们使用日志框架来打印信息,一般来说,日志框架的log级别从低到高是:debug, info, warn, error, fatal。
根据方法重载特性,当只输入一个参数时,此对象会被当做Object进行打印输出,如果是Exception e的话,这里直接就toString()。根据方法重载特性,当第二个参数为Throwable时,会打印出异常信息,并且包含异常堆栈信息。
可以直接用输出在函数内部调用时,把调用顺序打印出来。一个由C/C++编译的程序占用的内存分为以下几个部分 栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
log.error(this, e);log.error(ClassName.class, e);上面两种都可。在静态方法中时只能第二种方法。
手机调试Android程序出异常时不打印堆栈信息
RuntimeException re = new RuntimeException();re.fillInStackTrace();Log.e(info, info, re);这个可以将对应方法的所有调用过程打出来。
zygote的堆栈dump 实际上这个可以同时dump java线程及native线程的堆栈,对于java线程,java堆栈和native堆栈都可以得到。
C++也是支持异常处理的,异常处理库中,已经包含了获取backtrace的接口,Android也是利用这个接口来打印堆栈信息的。在Android的C++中,已经集成了一个工具类CallStack,在libutils.so中。
解决ANR问题,首先要做的是找到问题,线下我们可以通过ADB命令导出ANR文件进行分析,线上我们可以使用FileObserver或ANR-WatchDog保存ANR堆栈信息,然后上传到服务器。
android如何在C++中打印调用堆栈
复制代码 C 稍微麻烦一点,需要直接调用 corkscrew/backtrace。其实 C++ 里的 utils/Callstack 也是使用 corkscrew/backtrace,只是进行了封装更易于使用。我们参照 CallStack.cpp 里面代码即可。
使用方法:[cpp] view plaincopy#include utils/CallStack.h ... CallStack stack; stack.update(); stack.dump();使用方式比较简单。
可以直接用输出在函数内部调用时,把调用顺序打印出来。一个由C/C++编译的程序占用的内存分为以下几个部分 栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
到此,以上就是小编对于打印堆栈日志的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位老师在评论区讨论,给我留言。
版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本站联系的,一经查实,本站将立刻删除。