Android普通app在native层快速打印调用栈
经常需要判断某函数是否执行,何时执行。不知道为什么工作电脑的AndroidStudio不能附加native层调试器,如图1所示点击OK没有任何反应,那最快的调试方法就只能是加日志了。

在kotlin打印调用栈只需要一行:
但在native层有点麻烦了,查过了一些资料,简中博客大部分出自这一篇:
里面写了系统级别的app如何打印native层调用栈,通常是使用libutilscallstack,但是ndk提供的头文件并没有CallStack.h,如图2、3、4所示。



libutilscallstack.so在普通app实际是加载了的,如图5:

有没有可能使用使用dlopen+dlsym调用呢?dlopen传入libutilscallstack.so之后,logcat输出:
普通app,dlopen支持的系统的so是有限制的。或许有办法可以绕过这个限制,参考链接:
这个链接给的传入空的方法我这里MIUI14测试无效,至于其他办法,这不是自己的项目,不想引入太多只是为了调试用的代码,要不然提交代码的时候还要删掉。

很多JVM教程上来就会演示一个叫“jstack”的工具,可以打印出JVM所有线程正在执行的代码。Android没有jstack,但可以发送-3信号实现同样的目的,可以直接在/data/anr/生成trace_xxx文件,内容和触发ANR时生成的日志一样的。
但对于某些不带脑子乱改Android又剥夺解锁BL权力的独裁厂商,我们只能发送STOP信号强制使进程暂停然后触发ANR,因为这些愚蠢的UI系统使用adb bugreport没有把把/data/anr/trace_xx一起导出。

回到标题,Android普通app如何在native层快速打印调用栈,只需要两行代码:
为什么sleep?因为kill并不是阻塞的,可能系统处理完-3信号的时候,代码早就执行到其他地方了。而这里的sleep实际上很快就会被打断,至于为什么被打断,我现在还不好说..。
