Android下面打印进程函数调用堆栈(dump backtrace)的方法(http://blog.sina.com.cn/happychang2007)
来源:互联网 发布:网络推广效果评估 编辑:程序博客网 时间:2024/06/05 16:28
Android下面打印进程函数调用堆栈(dump backtrace)的方法
(2016-02-05 16:47:22)android
堆栈
调试
backtrace
1.
打印调用堆栈可以直接把问题发生时的函数调用关系打出来,非常有利于理解函数调用关系。比如函数A可能被B/C/D调用,如果只看代码,B/C/D谁调用A都有可能,如果打印出调用堆栈,直接就把谁调的打出来了。
不仅如此,打印函数调用堆栈还有另一个好处。在Android代码里,函数命名很多雷同的,虚函数调用,几个类里的函数名相同等,即使用source insight工具看也未必容易看清函数调用关系。如果用了堆栈打印,很容易看到函数调用逻辑。
那么一个问题来了,Android/kernel本身在发生问题(kernel panic, tombstone, …)时,都可以打出详细的堆栈信息,这里干嘛还要费劲研究打堆栈?答案是发生问题时的堆栈的确很详细,但这里研究的是不影响(准确说是基本不影响)系统运行的境况下,打印出某个情形下的堆栈信息,这个对源代码逻辑研究很有帮助。
2.
Kernel里最简单,直接有几现成的函数可以使用:
dump_stack() 这个函数打出当前堆栈和函数调用backtrace后接着运行
WARN_ON(x) 这个函数跟dump_stack很像,它有个条件,如果条件满足了就把stack打出来。
打印出来的结果都在kernel log里,一般dmesg命令就可以看到了
3.
Android在新版(至少5.0, 6.0)里加入了CallStack类,这个类可以打出当前的backtrace。用法很简单:
Ø
Ø
Ø
“haha”是在logcat输出的TAG,这里可以自己定义。如果上下文已经在android namespace里,”android::”前缀就不必加了。
Native C++的输出log可以在logcat里看到。
注意,在网上的一些文档里说要这么用:
CallStack stack;
stack.update();
stack.dump();
这样做已经不行了,在新版Android里编译不过。
4.
Android对C的堆栈打印支持不太好。过去网上的文章一般是推荐libcorkscrew.so,并加入大段代码来unwind_backtrace。新版Android上libcorkscrew已经被拿掉了,网上的加载libcorkscrew库的方法自然就不能用了。
一个简单方法是用C语言调C++的函数,对,就是extern “C”。
先在项目里加入一个c++文件,比如callstack.cpp,里面是:
#include
extern "C" void dumping_callstack(void);
void dumping_callstack(void)
{
}
在项目里再加入一个c++的头文件,比如callstack.h,里面是:
void dumping_callstack(void);
在Android.mk里源文件列表LOCAL_SRC_FILES里加入callstack.cpp,确保libutils在依赖列表里。
在native C里include callstack.h后直接调用dumping_callstack()就可以了。
这个log也可以在logcat里看到。
5.
Java最简单,它的backtrace最详细,连文件名和行号都打出来了:
Exception e = new Exception("haha");
e.printStackTrace();
log在logcat里看以看到。
- Android下面打印进程函数调用堆栈(dump backtrace)的方法(http://blog.sina.com.cn/happychang2007)
- Android下面打印进程函数调用堆栈(dump backtrace)的方法
- Android下面打印进程函数调用堆栈(dump backtrace)的方法
- Android下面打印进程函数调用堆栈(dump backtrace)的方法
- Android下面打印进程函数调用堆栈(dump backtrace)的方法
- Linux中Kill进程的N种方法(转自:http://blog.sina.com.cn/s/blog_975a2a540100ywyx.html)
- 进程终止函数:abort, atexit, exit, _exit, _Exit http://blog.sina.com.cn/s/blog_605f5b4f0100x3v0.html
- 新的blog:http://blog.sina.com.cn/jubanghuang
- blog的地址http://blog.sina.com.cn/gulant
- sql 判断 函数 存储过程是否存在的方法http://blog.sina.com.cn/s/blog_413fac2f0100mqrg.html
- Android 电子相册http://blog.sina.com.cn/s/blog_9968251c01014uu9.html
- typedef函数指针的用法(C++) (转载的http://blog.sina.com.cn/s/blog_5e71ee700100fo13.html)
- C的xml编程-libxml2(函数总结篇) http://blog.sina.com.cn/s/blog_6a1837e90100ns9j.html
- 控制台输出Unicode中文的方法http://blog.sina.com.cn/s/blog_711203fb0100s7h9.html
- core dump 相关保存(转自http://blog.sina.com.cn/s/blog_602f87700100ew04.html)
- http://blog.sina.com.cn/u/1218649393
- http://blog.sina.com.cn/yahuizhao
- http://blog.sina.com.cn/u/1585393965
- xutils3初级解析
- 越狱相关三:OpenSSH
- Linux文件系统
- C语言输入输出函数
- transform知识【学习总结】
- Android下面打印进程函数调用堆栈(dump backtrace)的方法(http://blog.sina.com.cn/happychang2007)
- 记忆化搜索简介
- SPI子系统驱动架构 - 驱动框架
- jQueryValidate 插件(表单验证功能)
- java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)
- android WIFI to unity
- 数组特点
- 史上最严高考年,指纹、人脸识别成焦点
- -TreeMap