Unwind 栈回溯 issue
- 1、.eh_frame信息中cie的Augmentation字段为空:
Oracle Linux 6.5
# readelf -wf oracle | more
Contents of the .eh_frame section:00000000 00000014 00000000 CIEVersion: 1Augmentation: ""Code alignment factor: 1Data alignment factor: -8Return address column: 16
正常为"zR":
$ readelf -wf /usr/sbin/sshd
Contents of the .eh_frame section:00000000 0000000000000014 00000000 CIEVersion: 1Augmentation: "zR"
- 2、elf段的加载地址不为0:
Oracle Linux 6.5
Address - Offset = loadoffset = 0x00000035fb15aaec - 0x0015aaec# readelf -S /lib64/libc-2.12.so
There are 78 section headers, starting at offset 0x1d6140:Section Headers:[Nr] Name Type Address OffsetSize EntSize Flags Link Info Align[17] .eh_frame_hdr PROGBITS 00000035fb15aaec 0015aaec00000000000065ec 0000000000000000 A 0 0 4[18] .eh_frame PROGBITS 00000035fb1610d8 001610d80000000000025994 0000000000000000 A 0 0 8
计算时补偿loadoffset:
int unw_get_unwind(...)
{rva += module_unwinds->elf_load_offset;}
一般系统下,Address - Offset = 0 = 0x000000000018e8fc - 0x0018e8fc
$ readelf -S /lib64/libc-2.17.so
There are 76 section headers, starting at offset 0x20d380:Section Headers:[Nr] Name Type Address OffsetSize EntSize Flags Link Info Align[19] .eh_frame_hdr PROGBITS 000000000018e8fc 0018e8fc0000000000006acc 0000000000000000 A 0 0 4[20] .eh_frame PROGBITS 00000000001953c8 001953c8000000000002a3c4 0000000000000000 A 0 0 8
- 3、elf的一个segment被映射到多个vma:
centos 7.7 :
$ fc-ctl cp add /usr/lib64/firefox/firefox
$ fc-ctl cp enable
根据vma的vm_pgoff来计算pc在section中的偏移:
int unw_get_unwind(...)
{if(vma && ip > vm->vm_start)rva = ip -vm->vm_start + (vm->vm_pgoff * _PAGE_SIZE);}
- 4、libc更新以后,某些进程还继续使用的是旧的libc,这些文件被标注成deleted
升级libc,centos7.7:
yum install glibc-devel.i686 libgcc.i686
把unwind cache的主key值由path改为uuid,这样可以同时存储两份同名的unwind信息。
- 5、unwind fde信息中有 length为0的情况,造成item rbtree中有两个相同pc值的情况
32bit的ld:
$ readelf -wF ~/fc/ld-2.17.so00001648 0000001c 0000164c FDE cie=00000000 pc=00015ea0..00015ebeLOC CFA ra
00015ea0 esp+4 c-4
00015ea0 esp+12 c-4
00015ea1 esp+16 c-4
00015ea2 esp+20 c-4
00015ea3 esp+24 c-4
00015eb1 esp+20 c-4
修改:
static void computed_state(...)
{/* 在调试中发现unwind信息中有pc重复的情况会造成红黑树中存在两个key值相同的节点,造成查找出错。这里丢弃掉length=0的节点例如: readelf -wF /home/ipu/fc/ld-2.17.so (32位系统)00001648 0000001c 0000164c FDE cie=00000000 pc=00015ea0..00015ebeLOC CFA ra 00015ea0 esp+4 c-4 00015ea0 esp+12 c-4 */if (0 == unwind.base.length)return;}
- 6、clone 函数 unwind信息被分成两段的调试
centos7.7:
$ ps -ef | grep rsyslogd
root 1740 1 0 05:00 ? 00:01:33 /usr/sbin/rsyslogd -n$ sudo service rsyslog stop$ gdb /usr/sbin/rsyslogd
$ b main
$ r -n
$ b clone
$ c
$ ni
$ b *0x7ffff6aa4851
$ ni
规避修改:
int unw_get_unwind(...)
{_read_lock(&_r_unwind_lock);u = (unwind_item_t *)sym_search_by_range(&module_unwinds->root, rva-5) ;_read_unlock(&_r_unwind_lock);_trAssert_return(!u, (*state = &u->state, _SUCCESS)) ;}
- 7、unwind expression需要计算
32bit elf取栈
- 8、unwind信息中的所有指令为nop
[ipu@localhost code]$ md5sum /usr/lib64/libc-2.17.so
0b612f0ec4b4188307ed223ca59e4172 /usr/lib64/libc-2.17.so
[ipu@localhost code]$ md5sum /usr/lib/systemd/systemd-journald
1abe893e8cbd2bf8053e205f81fff479 /usr/lib/systemd/systemd-journald
[ipu@localhost code]$- [ Stack Info ] : - [Depth] [Result] [VA] [RVA] [Sym] [Img]0 0 7F432CA4B5C7 F75C7 ftruncate64+7 /usr/lib64/libc-2.17.so1 80000000 55F33FB8F1A8 C1A8 sub_B1E0+FC8 /usr/lib/systemd/systemd-journald2 80000000 55F33FB91A3F EA3F sub_E880+1BF /usr/lib/systemd/systemd-journald- [Stack API] : ftruncate64+7(F75C7)
Unwind 栈回溯 issue相关推荐
- Unwind 栈回溯详解:libunwind
目录 1. 历史背景 1.1 frame pointers 1.2 .debug_frame (DWARF) 1.3 .eh_frame (LSB) 1.4 CFI directives 2. .de ...
- Unwind 栈回溯详解
文章目录 1. 历史背景 1.1 frame pointers 1.2 .debug_frame (DWARF) 1.3 .eh_frame (LSB) 1.4 CFI directives 2. . ...
- ARM平台(海思)unwind栈回溯的实现
最初,第一次接触到栈回溯是由于在追查不同的业务场景问题时,通常对方仅仅给你一个接口,而为了弄清楚场景的调用方向,就需要问不同的人,尝试不同的方法,自己想尝试通过一种方法能够加速对繁杂业务代码的阅读和理 ...
- 以SIGSEGV为例详解信号处理(与栈回溯)
以SIGSEGV为例详解信号处理(与栈回溯) 信号是内核提供的向用户态进程发送信息的机制, 常见的有使用SIGUSR1唤醒用户进程执行子程序或发生段错误时使用SIGSEGV保存用户错误现场. 本文以S ...
- Linux内核出错的栈打印详解,linux内核中打印栈回溯信息 - dump_stack()函数分析
简介 当内核出现比较严重的错误时,例如发生Oops错误或者内核认为系统运行状态异常,内核就会打印出当前进程的栈回溯信息,其中包含当前执行代码的位置以及相邻的指令.产生错误的原因.关键寄存器的值以及函数 ...
- 深入浅出根据函数调用过程谈栈回溯原理
通过分析函数调用过程的堆栈变化,可以看出在被调函数的EBP寄存器地址存放的是调用函数的EBP寄存器地址,EBP地址+4存放的是函数调用完成后的下一条指令存放地址,该指令的前一条 ...
- 项目经验之谈--驱动崩溃分析之栈回溯技术与反汇编
1.序言 驱动往往是芯片厂商提供的,而且是不开源的. 一旦崩溃很难查找原因,当然办法是有的,比如内核为此也提供栈回溯技术(低版本的好像没有实现)来定位分析驱动问题.再不济也可以反汇编ko文件. 2.栈 ...
- 栈回溯技术arm_v5t_le版
栈回溯技术arm_v5t_le版 From:韦东山 2007.04.03栈回溯技术及uClibc的堆实现原理.doc 1. 前言 段错误.非法地址访问等问题导致程序崩溃的现象屡屡发生,如果能找到 ...
- x86对抗栈回溯检测
1.原理 函数调用 CALL 指令可拆分为两步操作: 1).将调用者的下一条指令(EIP)的地址压栈 2).跳转至将要调用的函数地址中(相对偏移或绝对地址) 那么在执行到子函数首地址位置时,返回地址( ...
最新文章
- 2015 多校第三场
- stream对多个字段分组_java8 stream 如何按多字段分组,并对一个字段求和
- 《南溪的python灵隐笔记》——有趣的Munch字典库
- 名企面试官精讲典型编程题之C#篇
- 使用Asp.net MVC源代码调试你的应用程序
- Rsync结合Inotify 实时同步配置
- 【dubbo源码解析】--- dubbo的服务暴露+服务消费(RPC调用)底层原理深入探析
- mysql中的cube和rollup_【hive】cube和rollup函数
- 服务器硬盘开机吱吱响,硬盘吱吱响怎么回事?电脑硬盘响动原因和解决方法
- 玩游戏提示计算机内存不足,Win10玩吃鸡游戏提示“虚拟内存不足”怎么办?
- 大龄程序员的出路究竟在何处?从369个过来人问答贴里,我们得到了答案
- 基于stm32f103的俄罗斯方块游戏
- 一篇文章带你全面了解“电脑”内外组成
- 认清影响因子引发的是是非非,善待逆境中顽强崛起的国产期刊
- R语言作业:样本容量与好样本概率的关系
- [COCI2008-2009#2] PERKET
- QSocketNotifier 解读
- 【数集项目之 MCDF】(一) 控制寄存器 control_register
- matlab显示警告:由于未找到因为输出,无法播放音频
- 常用数字设计仿真工具(QuestaSim,VCS,IUS,Verdi等)使用入门