• 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相关推荐

  1. Unwind 栈回溯详解:libunwind

    目录 1. 历史背景 1.1 frame pointers 1.2 .debug_frame (DWARF) 1.3 .eh_frame (LSB) 1.4 CFI directives 2. .de ...

  2. Unwind 栈回溯详解

    文章目录 1. 历史背景 1.1 frame pointers 1.2 .debug_frame (DWARF) 1.3 .eh_frame (LSB) 1.4 CFI directives 2. . ...

  3. ARM平台(海思)unwind栈回溯的实现

    最初,第一次接触到栈回溯是由于在追查不同的业务场景问题时,通常对方仅仅给你一个接口,而为了弄清楚场景的调用方向,就需要问不同的人,尝试不同的方法,自己想尝试通过一种方法能够加速对繁杂业务代码的阅读和理 ...

  4. 以SIGSEGV为例详解信号处理(与栈回溯)

    以SIGSEGV为例详解信号处理(与栈回溯) 信号是内核提供的向用户态进程发送信息的机制, 常见的有使用SIGUSR1唤醒用户进程执行子程序或发生段错误时使用SIGSEGV保存用户错误现场. 本文以S ...

  5. Linux内核出错的栈打印详解,linux内核中打印栈回溯信息 - dump_stack()函数分析

    简介 当内核出现比较严重的错误时,例如发生Oops错误或者内核认为系统运行状态异常,内核就会打印出当前进程的栈回溯信息,其中包含当前执行代码的位置以及相邻的指令.产生错误的原因.关键寄存器的值以及函数 ...

  6. 深入浅出根据函数调用过程谈栈回溯原理

                通过分析函数调用过程的堆栈变化,可以看出在被调函数的EBP寄存器地址存放的是调用函数的EBP寄存器地址,EBP地址+4存放的是函数调用完成后的下一条指令存放地址,该指令的前一条 ...

  7. 项目经验之谈--驱动崩溃分析之栈回溯技术与反汇编

    1.序言 驱动往往是芯片厂商提供的,而且是不开源的. 一旦崩溃很难查找原因,当然办法是有的,比如内核为此也提供栈回溯技术(低版本的好像没有实现)来定位分析驱动问题.再不济也可以反汇编ko文件. 2.栈 ...

  8. 栈回溯技术arm_v5t_le版

    栈回溯技术arm_v5t_le版 From:韦东山 2007.04.03栈回溯技术及uClibc的堆实现原理.doc 1.    前言 段错误.非法地址访问等问题导致程序崩溃的现象屡屡发生,如果能找到 ...

  9. x86对抗栈回溯检测

    1.原理 函数调用 CALL 指令可拆分为两步操作: 1).将调用者的下一条指令(EIP)的地址压栈 2).跳转至将要调用的函数地址中(相对偏移或绝对地址) 那么在执行到子函数首地址位置时,返回地址( ...

最新文章

  1. 2015 多校第三场
  2. stream对多个字段分组_java8 stream 如何按多字段分组,并对一个字段求和
  3. 《南溪的python灵隐笔记》——有趣的Munch字典库
  4. 名企面试官精讲典型编程题之C#篇
  5. 使用Asp.net MVC源代码调试你的应用程序
  6. Rsync结合Inotify 实时同步配置
  7. 【dubbo源码解析】--- dubbo的服务暴露+服务消费(RPC调用)底层原理深入探析
  8. mysql中的cube和rollup_【hive】cube和rollup函数
  9. 服务器硬盘开机吱吱响,硬盘吱吱响怎么回事?电脑硬盘响动原因和解决方法
  10. 玩游戏提示计算机内存不足,Win10玩吃鸡游戏提示“虚拟内存不足”怎么办?
  11. 大龄程序员的出路究竟在何处?从369个过来人问答贴里,我们得到了答案
  12. 基于stm32f103的俄罗斯方块游戏
  13. 一篇文章带你全面了解“电脑”内外组成
  14. 认清影响因子引发的是是非非,善待逆境中顽强崛起的国产期刊
  15. R语言作业:样本容量与好样本概率的关系
  16. [COCI2008-2009#2] PERKET
  17. QSocketNotifier 解读
  18. 【数集项目之 MCDF】(一) 控制寄存器 control_register
  19. matlab显示警告:由于未找到因为输出,无法播放音频
  20. 常用数字设计仿真工具(QuestaSim,VCS,IUS,Verdi等)使用入门

热门文章

  1. 为什么很多人选择15年还房贷?
  2. 四和能聚分析脚本对短视频拍摄的重要性
  3. 笔记markdown
  4. VSCode快捷键中英文对照表
  5. Centos7环境启动docker报polkit服务启动失败
  6. shell中循环数组
  7. CAD版本怎么转化?这里有好用的小妙招
  8. 李岳恒:警惕STO成为次级资产的包装纸
  9. iosios的源码是怎么被泄露_iOS9源码泄露,是真的么?
  10. linux分区使用的命令为,Linux分区命令fdisk图文详解