V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
aWangami
V2EX  ›  程序员

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

  •  1
     
  •   aWangami · 2014-07-24 13:42:13 +08:00 · 6946 次点击
    这是一个创建于 3564 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前尝试过这些方法,还有遇到的问题
    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

    大家有类似的经验吗,或者有现成的解决方案?
    第 1 条附言  ·  2014-07-25 12:41:12 +08:00
    嗯怎么说内,目前需要这个功能,主要是为了分析代码,不是调试程序(当然咯,日后需要Debug的时候还是有帮助的),代码的调用层次比较多和结构有复杂,一步一步跟踪跳转很辛苦..t_t
    17 条回复    2014-08-06 21:59:13 +08:00
    liwei
        1
    liwei  
       2014-07-24 14:00:25 +08:00
    向进程发送ABORT信号生成core文件,然后用gdb打开core文件, bt
    xdeng
        2
    xdeng  
       2014-07-24 14:18:10 +08:00
    打印函数的调用堆栈 系统api吧
    bengol
        3
    bengol  
       2014-07-24 14:19:44 +08:00   ❤️ 1
    参考gprof的实现, 跟踪FramePointer, 之前我用的是这个
    xylophone21
        4
    xylophone21  
       2014-07-24 20:50:17 +08:00
    2.使用Android提供的utils/CallStack.h,但是NDK中没有,这是不是意味着需要编译源码?

    把机器里的库拷出来依赖-l一下就可以了
    Akagi201
        5
    Akagi201  
       2014-07-25 11:03:14 +08:00
    这个应该可以自己实现, 我以前一个同事实现过, 但是多线程下不准. 几乎没有用.
    aWangami
        6
    aWangami  
    OP
       2014-07-25 12:36:05 +08:00
    @liwei 这样程序会退出吗..
    aWangami
        7
    aWangami  
    OP
       2014-07-25 12:36:22 +08:00
    @xdeng 比如说?
    aWangami
        8
    aWangami  
    OP
       2014-07-25 12:36:49 +08:00
    @bengol thks,得花时间研究了..
    aWangami
        9
    aWangami  
    OP
       2014-07-25 12:38:41 +08:00
    @xylophone21 有想法去尝试,后来发现依赖太...估计整个core都得弄下来还不知道行不行...so..不知道是否有更简便直接的方法
    aWangami
        10
    aWangami  
    OP
       2014-07-25 12:39:21 +08:00
    @Akagi201 怎么实现的呀,求代问一下~
    xylophone21
        11
    xylophone21  
       2014-07-25 13:14:45 +08:00   ❤️ 1
    @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
        12
    aWangami  
    OP
       2014-07-25 16:07:35 +08:00
    @xylophone21 是这样的..
    假如现在我有一个文件需要使用CallStack.h的方法,那就需要#include<CallStack.h>是不,不然编译就过不了,然后CallStack有依赖了其他的头文件..这样一层一层的...
    xylophone21
        13
    xylophone21  
       2014-07-25 18:20:27 +08:00   ❤️ 1
    @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
        14
    fungo  
       2014-07-25 18:43:13 +08:00   ❤️ 1
    google-breakpad 可以主动 call 的
    bombless
        15
    bombless  
       2014-07-26 01:52:34 +08:00
    搞个源代码处理工具打桩吧
    aWangami
        16
    aWangami  
    OP
       2014-08-06 21:58:43 +08:00
    @xylophone21 找个时间试试看~
    aWangami
        17
    aWangami  
    OP
       2014-08-06 21:59:13 +08:00
    @bombless 现在用SourceInsight进行代码阅读
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2686 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 05:07 · PVG 13:07 · LAX 22:07 · JFK 01:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.