debug: 反汇编debug流程(kernel、smaps、addr2line)
问题背景:
查一个概率性出现的问题,与运行环境有关且无法coredump和attach,最后请教大神解决了。解决过程颇有演绎推理的感觉,遂记录于此。详细可见 https://blog.csdn.net/l316194152/article/details/108563637
简要描述:
一、修改系统内核,在出错处截获信号进入循环。
二、复现问题,获取指针地址A和进程号B。
三、根据B进程的smaps内存映射表,由A所在地址区间得到出错的库,记录库的起始地址C。
四、A-C=D,再对库进行反汇编,得到偏移量D所属的函数。
五、甩锅,把问题甩出去。
具体步骤:
1、修改系统内核,在出错处截获信号进入循环。
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
index a9ee0d9dc740..73b52806f1f1 100644
--- a/arch/arm/mm/fault.c
+++ b/arch/arm/mm/fault.c
@@ -175,9 +175,15 @@ __do_user_fault(struct task_struct *tsk, unsigned long addr,tsk->comm, sig, addr, fsr);show_pte(tsk->mm, addr);show_regs(regs);
+ ret = sig_kernel_coredump(SIGSEGV);
+ printk(KERN_DEBUG "ret is %d\n", ret);
+ while(1);}
#endif
Q:为什么加在这个函数?
A:看第二步即可知,出错时,kernel有运行到此函数。
2、复现问题,获取指针地址A和进程号B
[ 28.587915] xxx.cgi: unhandled page fault (11) at 0x00000008, code 0x017
[ 28.587934] pgd = 6510e4e1
[ 28.588024] [00000008] *pgd=28844835, *pte=00000000, *ppte=00000000
[ 28.588057] CPU: 1 PID: 897 Comm: xxx.cgi Tainted: G O 4.19.111
[ 28.588066] Hardware name: Generic DT based system
[ 28.588078] PC is at 0xa6774b8c
[ 28.588086] LR is at 0xa5e005e0
[ 28.588094] pc : [<a6774b8c>] lr : [<a5e005e0>] psr: a00e0010
[ 28.588101] sp : a67059d0 ip : a5e005d8 fp : a6705f7c
[ 28.588109] r10: a6ecc60c r9 : a679169c r8 : aedd3986
[ 28.588117] r7 : a6ecc5dc r6 : 00000000 r5 : a6ecc5d8 r4 : a67059dc
[ 28.588124] r3 : a5e00010 r2 : 00000000 r1 : 00000000 r0 : a5e005d8
[ 28.588133] Flags: NzCv IRQs on FIQs on Mode USER_32 ISA ARM Segment user
[ 28.588143] Control: 10c5387d Table: 3496006a DAC: 00000055
[ 28.588154] CPU: 1 PID: 897 Comm: sss.cgi Tainted: G O 4.19.111
[ 28.588161] Hardware name: Generic DT based system
[ 28.588191] [<b010f408>] (unwind_backtrace) from [<b010b96c>] (show_stack+0x10/0x14)
[ 28.588209] [<b010b96c>] (show_stack) from [<b08076e4>] (dump_stack+0x90/0xa4)
[ 28.588229] [<b08076e4>] (dump_stack) from [<b011376c>] (__do_user_fault+0x160/0x174)
[ 28.588246] [<b011376c>] (__do_user_fault) from [<b01139c0>] (do_page_fault+0x240/0x348)
[ 28.588260] [<b01139c0>] (do_page_fault) from [<b0113c58>] (do_DataAbort+0x4c/0xec)
[ 28.588274] [<b0113c58>] (do_DataAbort) from [<b0101d7c>] (__dabt_usr+0x3c/0x40)
[ 28.588283] Exception stack(0xcb9c9fb0 to 0xcb9c9ff8)
[ 28.588294] 9fa0: a5e005d8 00000000 00000000 a5e00010
[ 28.588305] 9fc0: a67059dc a6ecc5d8 00000000 a6ecc5dc aedd3986 a679169c a6ecc60c a6705f7c
[ 28.588316] 9fe0: a5e005d8 a67059d0 a5e005e0 a6774b8c a00e0010 ffffffff
注意其中的
[ 28.588057] CPU: 1 PID: 897 Comm: xxx.cgi Tainted: G O 4.19.111
[ 28.588078] PC is at 0xa6774b8c
0xa6774b8c即为指针地址A,进程号B为897 。
3、根据B进程的smaps内存映射表,由A所在地址区间得到出错的库,记录库的起始地址C。
cd /proc/$B
cat smaps|grep $A
注意: 有时候grep地址A没有结果,这时候可以改为grep前两位,比如地址为a6764000,则grep a67即可。
4、A-C=D,再对库进行反汇编,得到偏移量D所属的函数。
第三步可以看到类似下面样式的信息
a6764000-a6780000 r-xp 00000000 b3:06 1743 /usr/lib/libxxx.so.0.0.0
接下来就是十六进制计算了,hex(0xa6774b8c-a6764000) = 0x10b8c
把运行环境下的这个/usr/lib/libxxx.so.0.0.0库pull出来,或者push一个addr2line进去都行。
arm-linux-gnueabihf-addr2line 0x10b8c -e libxxx.so.0.0.0 -f -C -s
即可得到出错函数名
5、甩锅,把问题甩出去
如果这个函数是你写的,那没得说,自己改吧。
但如果你已经成功得到了函数名,并且不是你写的,而是调用的外部接口,那么恭喜你,可以把这个锅甩出去了。
debug: 反汇编debug流程(kernel、smaps、addr2line)相关推荐
- const debug = require(‘debug‘)(‘cnpm‘)
const debug = require('debug')('cnpm'); 就是自己的版本太低,此时重新卸载,再进行下载就可以了 我用的是16年的0.12,版本过低 ^^^^^ SyntaxErr ...
- s:property=a value=/取的s:debug/s:debug中的value stack中的属性值
<s:property="a" value=""/>取的<s:debug></s:debug>中的value stack中 ...
- IDEA上Debug调试全流程
一.什么是Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序.使用IDEA的断点调试功能,查看程序的运行过程 Debug调试窗口介绍. 二 ...
- Linux内核开启DebugFS以及查看debug信息(/sys/kernel/debug及debugfs)
一.Linux内核开启DebugFS 进入内核配置界面,查找DebugFS: 开启配置: 二.Linux内核挂载DebugFS mount -t debugfs none /sys/kernel/de ...
- debug命令(debug命令的使用)
debug低格硬盘的命令怎么用? (2).通过调用INT13H中断的7号功能对硬盘进行低格操作如下:A:\DEBUG-A100-XXXX:0100MOVAX,0703:(交叉因子为3)-XXXX:01 ...
- drm debug log with drm.debug=6 debug
t:s0 msg='unit=kmod-static-nodes comm="systemd" exe="/usr/lib/systemd/systemd" h ...
- mmap原理及流程(kernel 4.1版本)
背景 最近在分析问题时,遇到了mmap fb设备失败问题,顺便看了下4.1版本内核中的mmap相关流程,以前看过老版本的,有些忘记了,这里权当记录,供后续参考. mmap是什么? 相信做过Linux开 ...
- Qt 可以编译但是无法运行和 debug(debug 时出现 lauching debugger 报红)
Qt 在debug 时出现 lauching debugger 报红 在出现这种情况时,一般伴随另外两种种情况,无法运行(run),但是可以构建如下所示: debug 时出现如下情况 运行时出现如下情 ...
- windows软件进行反汇编修复流程
本文以Crackme160为例子,示例文件都在该例子中https://gitee.com/cnhellorui/Crackme160 节一:x64dbg逐步调试修复 前言与总结 该节里只需x64dbg ...
最新文章
- [示例]NSDictionary-按value排序数组中的字典并输出(描述器)
- python3 词法拆分
- Java操作shell脚本
- 爱护身体之简易程序员健身操
- -3dB下的正确率是100%!!!
- 电脑亮度多少对眼睛好_激光治疗近视眼大概要多少费用,保护好眼睛要做到哪几点...
- linux pid t 头文件_pid和tid及线程调度
- loadrunner之header相关,token等
- 不同操作系统下重置root密码的方法
- Python SQLite教程
- Springboot属性文件application.properties配置大全,版本:1.5.4
- java 正则 连续换行_Java正则表达式匹配回车换行多行
- Word复制表格样式变化问题
- 我在京东这一年—张亮
- win10邮箱怎么设置qq邮箱服务器地址,老鸟给你说win10自带邮件怎么添加qq邮箱的解决方式...
- django问题mysqlclient 1.4.0 or newer is required
- php+转义反斜线,PHP 转义序列(反斜线)
- 狗狗自带餐具能有多可爱
- 每周小节-2 d3-zoom,pan,brush阅读心得 d3.js on angular读书笔记
- 技能大赛计算机主板维修报表,2017年职业院校技能大赛高职组电子产品芯片级检测维修与数据恢复赛项样题...
热门文章
- ubuntu安装Redis 及指定配置文件启动redis和报配置文件错误的原因
- 【转】为什么 ++[[]][+[]]+[+[]] = 10 ?
- cl.exe link.exe用法详解
- 2022中国国际塑料展主办单位已被法院列为老赖
- C#开发实例大全(提高卷)
- HTTP协议之TCP/UDP区别
- 将word文档导入数据库_如何将用户信息插入Word文档
- 加载/保存 .pt 文件
- javascript 生成器函数 function*
- [转]在中国做量化交易一天的工作内容