android r base
信号相关流程梳理
程序分为两种:
1.静态链接
: 由链接器在链接时将库的内容添加到可执行程序中的做法,最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存也会消耗更多的时间。
2.动态链接
: 将独立的模块先编译成动态库,程序运行有需要它们时才加载,最大缺点是可执行程序依赖分别存储的库文件才能正确执行。
在Android中,大部分都是动态链接,而只有init等少部分是静态链接,因此native程序也是动态链接程序,动态链接程序是需要链接器才能跑起来,liner就是Android的链接器。
liner也是在程序的进程空间内,当内核将应用程序加载起来后,并不是先跑应用程序代码,而是先跑liner。linker
负责将应用程序所需的库加载到进程空间内,之后才跑应用程序代码。
绝大多数的native app都是以linker为入口(动态连接的程序),在启动时先由汇编跳转到__link_init函数.
[-> arch/arm64/begin.S]
1 | ENTRY(_start) |
到debuggerd_init的调用链
1 | -- bl __linker_init |
1 | void linker_debuggerd_init() { |
debuggerd_init
所在库 /home/mi/work_space/miui-r-umi-dev/system/core/debuggerd/handler/debuggerd_handler.cpp libdebuggerd_handler_core
1 | void debuggerd_init(debuggerd_callbacks_t* callbacks) { |
信号的处理函数为 debuggerd_signal_handler
debuggerd_signal_handler
连接到bionic上的native程序(C/C++)出现异常时,kernel会发送相应的signal; 当进程捕获致命的signal,通知debuggerd调用ptrace来获取有价值的信息(发生crash之前)。
1 | static void debuggerd_signal_handler(int signal_number, siginfo_t* info, void* context) { |
debuggerd_dispatch_pseudothread
1 | static int debuggerd_dispatch_pseudothread(void* arg) { |