C 语言怎么打印函数的调用堆栈?

2014-07-24 13:42:13 +08:00
 aWangami
目前尝试过这些方法,还有遇到的问题
1.Android平台Native开发,backtrace()不能使用,因为是Glibc的东东你懂得,Android用的是Bionic
2.使用Android提供的utils/CallStack.h,但是NDK中没有,这是不是意味着需要编译源码?
3.有人说可以调用libcorkscrew.so的方法,尝试了一下,后来发现还是缺少头文件,属于AOSP中的内容吗?
4.注意哦,是Native层的,不是在Java层
5.是需要的时候随时打印堆栈,不是在异常发生的时候捕获异常信息(这好像不是C中的说法,不过大概是这样意思),是在程序中主动打印,不需要外部来通过类似adb shell命令来dump之类的

大概是这些,这里是找到的一些资源
http://www.gnu.org/software/libc/manual/html_node/Backtraces.html
http://stackoverflow.com/questions/11470190/how-to-use-callstack-in-callstack-tpp-in-a-executable-on-android-platform
http://blog.csdn.net/freshui/article/details/9456889

大家有类似的经验吗,或者有现成的解决方案?
7071 次点击
所在节点    程序员
17 条回复
liwei
2014-07-24 14:00:25 +08:00
向进程发送ABORT信号生成core文件,然后用gdb打开core文件, bt
xdeng
2014-07-24 14:18:10 +08:00
打印函数的调用堆栈 系统api吧
bengol
2014-07-24 14:19:44 +08:00
参考gprof的实现, 跟踪FramePointer, 之前我用的是这个
xylophone21
2014-07-24 20:50:17 +08:00
2.使用Android提供的utils/CallStack.h,但是NDK中没有,这是不是意味着需要编译源码?

把机器里的库拷出来依赖-l一下就可以了
Akagi201
2014-07-25 11:03:14 +08:00
这个应该可以自己实现, 我以前一个同事实现过, 但是多线程下不准. 几乎没有用.
aWangami
2014-07-25 12:36:05 +08:00
@liwei 这样程序会退出吗..
aWangami
2014-07-25 12:36:22 +08:00
@xdeng 比如说?
aWangami
2014-07-25 12:36:49 +08:00
@bengol thks,得花时间研究了..
aWangami
2014-07-25 12:38:41 +08:00
@xylophone21 有想法去尝试,后来发现依赖太...估计整个core都得弄下来还不知道行不行...so..不知道是否有更简便直接的方法
aWangami
2014-07-25 12:39:21 +08:00
@Akagi201 怎么实现的呀,求代问一下~
xylophone21
2014-07-25 13:14:45 +08:00
@aWangami 不麻烦啊,只把手机的里的库拷出来就行了,又没要你编译什么的.就算都拷出来,你的/system/lib目录能有多大?何况根本不需要.

MHAL_LDLIBS := -L$(PLT_PATH)/lib -L$(PLT_PATH)/../mtal_lib -L$(PLT_PATH)/../ts_player_lib -L$(PLT_PATH)/../smart_card/alcormicro \
-llog -lutils -lmedia -landroid_runtime -lgui -lcutils -lbinder

LOCAL_LDLIBS := $(MHAL_LDLIBS)
aWangami
2014-07-25 16:07:35 +08:00
@xylophone21 是这样的..
假如现在我有一个文件需要使用CallStack.h的方法,那就需要#include<CallStack.h>是不,不然编译就过不了,然后CallStack有依赖了其他的头文件..这样一层一层的...
xylophone21
2014-07-25 18:20:27 +08:00
@aWangami 都考呗,编译环境不差这点硬盘.多放点头文件怕什么?反正是调试用.


src=$1

if [ -z $src ]; then
echo "Usage: $0 [android src folder]"
exit 1
fi

if [ ! -d $src ]; then
echo "$src not exist"
fi

HEADER_FILES="$src/dalvik/libnativehelper/include
$src/system/core/include
$src/hardware/libhardware/include
$src/external/skia/include
$src/frameworks/base/include
$src/frameworks/base/native/include
$src/frameworks/base/opengl/include"

tar -cvf header.tar $HEADER_FILES
fungo
2014-07-25 18:43:13 +08:00
google-breakpad 可以主动 call 的
bombless
2014-07-26 01:52:34 +08:00
搞个源代码处理工具打桩吧
aWangami
2014-08-06 21:58:43 +08:00
@xylophone21 找个时间试试看~
aWangami
2014-08-06 21:59:13 +08:00
@bombless 现在用SourceInsight进行代码阅读

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/124268

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX