Kernel Backtrace 无法显示出具体的地址.
在手工抓kernel backtrace, 无法抓到显示具体的地址. 如:
XXXXX:/ # cat proc/self/stack
[<0000000000000000>] save_stack_trace_tsk+0x0/0xd8
[<0000000000000000>] proc_pid_stack+0xbc/0x110
[<0000000000000000>] proc_single_show+0x54/0xa8
[<0000000000000000>] seq_read+0x1c4/0x460
[<0000000000000000>] __vfs_read+0x34/0xf0
[<0000000000000000>] vfs_read+0x78/0x138
[<0000000000000000>] SyS_read+0x5c/0xc8
[<0000000000000000>] cpu_switch_to+0x210/0x2b8
[<0000000000000000>] 0xffffffffffffffff
[<0000000000000000>] save_stack_trace_tsk+0x0/0xd8
[<0000000000000000>] proc_pid_stack+0xbc/0x110
[<0000000000000000>] proc_single_show+0x54/0xa8
[<0000000000000000>] seq_read+0x1c4/0x460
[<0000000000000000>] __vfs_read+0x34/0xf0
[<0000000000000000>] vfs_read+0x78/0x138
[<0000000000000000>] SyS_read+0x5c/0xc8
[<0000000000000000>] cpu_switch_to+0x210/0x2b8
[<0000000000000000>] 0xffffffffffffffff
同样, 通过 proc/kallsyms 时, 默认也会发现无法打印出地址信息.
这个是因为kernel pointer restrict的 限制, 为防止指针地址泄露,给hacker 有可乘之机, 将地址屏蔽了. android 默认有开启了,在android O 上参考代码:
/system/core/init/init.cpp
443/* Set kptr_restrict to the highest available level. 444 * 445 * Aborts if unable to set this to an acceptable value. 446 */ 447static int set_kptr_restrict_action(const std::vector& args) 448{ 449 std::string path = KPTR_RESTRICT_PATH; 450 451 if (!set_highest_available_option_value(path, KPTR_RESTRICT_MINVALUE, KPTR_RESTRICT_MAXVALUE)) { 452 LOG(ERROR) << "Unable to set adequate kptr_restrict value!"; 453 security_failure(); 454 } 455 return 0; 456}
手工修改方式是:
adb shell "echo 0 > proc/sys/kernel/kptr_restrict"