Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何获取android so 符号表? #727

Closed
Zliu404 opened this issue Mar 23, 2020 · 12 comments
Closed

如何获取android so 符号表? #727

Zliu404 opened this issue Mar 23, 2020 · 12 comments

Comments

@Zliu404
Copy link

Zliu404 commented Mar 23, 2020

你在什么场景下需要该功能?

问题定位时,通常需要使用符号表文件还原堆栈。

描述可能的解决方案

使用 ndk 编译 so 时,会在 obj/local/<架构(Architecture)>/ 下生成符号表文件,使用 xmake 如何获取符号表文件呢?

@waruqi
Copy link
Member

waruqi commented Mar 23, 2020

那个只不过是带了符号的so库,又不是单独的符号文件。。

xmake.lua里面如果设置了add_rules("mode.debug", "mode.release")

那么,切到调试模式编译的so库,就是带符号的,默认release编译就是不带符号的

xmake f -m debug
xmake
xmake f -m release
xmake

@Zliu404
Copy link
Author

Zliu404 commented Mar 23, 2020

那个只不过是带了符号的so库,又不是单独的符号文件。。

xmake.lua里面如果设置了add_rules("mode.debug", "mode.release")

那么,切到调试模式编译的so库,就是带符号的,默认release编译就是不带符号的

是的,严格来说就是 strip 前的 so。 构建 release 的库时,有没有可能拿到中间过程带符号的so?
另外,debug 和 release 编译参数差异,xmake 源码是在哪个模块可以看到?

@waruqi
Copy link
Member

waruqi commented Mar 23, 2020

编译参数,你敲xmake -v 编译就能看到完整的。。

如果你不想改其他的flags,仅仅追加调试符号,自己额外设置下就行了

set_symbols("debug")
set_strip("none")

@waruqi
Copy link
Member

waruqi commented Mar 23, 2020

也可以直接到 https://github.com/xmake-io/xmake/blob/master/xmake/rules/mode/xmake.lua 看下内置的模式配置

@Zliu404
Copy link
Author

Zliu404 commented Mar 23, 2020

编译参数,你敲xmake -v 编译就能看到完整的。。

如果你不想改其他的flags,仅仅追加调试符号,自己额外设置下就行了

set_symbols("debug")
set_strip("none")

好的, 感谢!
在编译release时,set_strip("none") 就可以了吧。拿到带符号表的so,然后再额外执行一次 strip 命令,得到最终release的so。

@Zliu404
Copy link
Author

Zliu404 commented Mar 23, 2020

我还原了一下ndk-build的流程,分了三步编译-链接-strip,看是否可以在xmake的流程里加上这个逻辑。这个应该是发布SDK上线使用的一个常见需求。

编译 : obj/local/armeabi-v7a/objs/{Project}/////Source/yyyy.o
链接输出:obj/local/armeabi-v7a/xxxx.so
拷贝输出:libs\armeabi-v7a\xxxx.so
执行strip:arm-linux-androideabi-strip --strip-unneeded libs\armeabi-v7a\xxxx.so

看到 target 里有提供 after link 方法,不知道能否用在这种场景,可否提供一下思路?

@waruqi
Copy link
Member

waruqi commented Mar 23, 2020

几种方式

  1. 你可以自己在 after_link里面调用strip
  2. 不采用内置mode规则,直接切编译mode,编译两边,一遍带符号,一遍不带符号,自己判断下mode,来决定是否开启符号,其他flags都保持一致
if is_mode("debug") then
    set_strip("none")
    set_symbols("debug")
end
target("xxx")
xmake f -m debug
xmake
xmake f -m release
xmake

如果觉得繁琐,可以通过 xmake macro 记录一个命名宏来回放,或者自己搞个脚本批量处理下

也可以定义个task,来单独做所有的编译打包打包逻辑,内置自己执行下 os.exec("xmake f -m debug") 什么的

@waruqi
Copy link
Member

waruqi commented Mar 23, 2020

你先试试吧 回头有时间我对android库打包针对性优化下好了

@waruqi waruqi modified the milestones: v2.3.2, v2.3.3 Mar 23, 2020
@waruqi
Copy link
Member

waruqi commented Mar 28, 2020

这块我会在下个版本加个rule单独处理下,实现可配置自动生成符号,这个版本暂时先不动了,这两天我要封板了

@waruqi
Copy link
Member

waruqi commented Apr 3, 2020

我改进过了,dev上支持对android/ios同时生成独立符号文件

如果target同时设置了下面两个设置,就会启用符号文件生成

target("test")
    set_symbols("debug")
    set_strip("all")

对于内置的release模式,默认不启用符号生成,仅仅只是strip targetfile,如果要启用,只需要再额外开启debug符号就行,因为mode.release内部默认已经启用了strip了。

add_rules("mode.release")
target("test")
    set_symbols("debug")

ios程序会生成.dSYM文件,然后同时Strip自身符号

[ 62%]: linking.release libtest.dylib
[ 62%]: generating.release test.dSYM

android程序会生成.sym文件(其实就是带符号的so/binary程序),然后同时Strip自身符号

[ 62%]: linking.release libtest.so
[ 62%]: generating.release test.sym

@fallending
Copy link
Contributor

generating.release test.sym

方便求教下,generating.release test.sym,该文件的生成命令不?我现在是用cmake,没找到合适的命令提取和xmake一样的sym文件~🙏🏻

@Issues-translate-bot
Copy link

Bot detected the issue body's language is not English, translate it automatically.


generating.release test.sym

For the convenience of asking, is there a command to generate generating.release test.sym for this file? I am using cmake now, but I can’t find a suitable command to extract the same sym file as xmake~🙏🏻

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants