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

Android native 程序如何得到函数的 call graph ?

  •  
  •   dawn009 · 2014-12-02 13:28:26 +08:00 · 3853 次点击
    这是一个创建于 2603 天前的主题,其中的信息可能已经有所发展或是发生改变。
    调试一个C语言程序的bug,想得到运行时的完整 call graph。

    思路:
    加上 gcc 的编译参数 -finstrument-functions,在每个函数调用时得到其内存地址,然后通过 dladdr() 得到函数名,输出log。

    但是实验失败,dladdr 返回 null。

    通过实验,发现在编译成共享库的情况下可以成功,可是我需要的是独立运行的二进制文件而不是共享库。

    情况1:
    编译成共享库,Android.mk 中用 BUILD_SHARED_LIBRARY。这种情况下dladdr可以得到函数名。

    问题在于情况2:
    编译成独立运行的二进制文件,Android.mk 中用 BUILD_EXECUTABLE。这时dladdr取不到函数名。

    有人知道该怎么解决吗?
    4 条回复    2014-12-03 15:41:17 +08:00
    pright
        1
    pright  
       2014-12-02 16:35:09 +08:00
    为啥不直接用CallStack?
    pright
        2
    pright  
       2014-12-02 16:53:29 +08:00   ❤️ 1
    哦,是C么。。那可以试试用backtrace(system/core/include/corkscrew/backtrace.h)。CallStack也是这个实现的。
    dawn009
        3
    dawn009  
    OP
       2014-12-03 12:58:31 +08:00
    5.0里似乎把libcorkscrew 换成了 libbacktrace,并且换成了 c++ 代码。

    我最后用 nm 导出符号表,自己计算偏移量搞定了。
    pright
        4
    pright  
       2014-12-03 15:41:17 +08:00
    改成c++其实也可以自己写个函数包一下给C调,看调用栈的时候就跳过自己写的函数就行
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4343 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:13 · PVG 16:13 · LAX 00:13 · JFK 03:13
    ♥ Do have faith in what you're doing.