Unwind 栈回溯 issue

Unwind 栈回溯 issue1 eh frame 信息中 cie 的 Augmentation 字段为空 OracleLinux6 5 readelf wforacle moreContents eh framesection 000000000000 1Augmentatio Codealignmen 1Dataalignme

  • 1、.eh_frame信息中cie的Augmentation字段为空:
    Oracle Linux 6.5

# readelf -wf oracle | more Contents of the .eh_frame section: 00000000 00000014 00000000 CIE Version: 1 Augmentation: "" Code alignment factor: 1 Data alignment factor: -8 Return address column: 16 

正常为”zR”:

$ readelf -wf /usr/sbin/sshd Contents of the .eh_frame section: 00000000 0000000000000014 00000000 CIE Version: 1 Augmentation: "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 Offset Size EntSize Flags Link Info Align [17] .eh_frame_hdr PROGBITS 00000035fb15aaec 0015aaec 00000000000065ec 0000000000000000 A 0 0 4 [18] .eh_frame PROGBITS 00000035fb1610d8 001610d8 0000000000025994 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 Offset Size EntSize Flags Link Info Align [19] .eh_frame_hdr PROGBITS 000000000018e8fc 0018e8fc 0000000000006acc 0000000000000000 A 0 0 4 [20] .eh_frame PROGBITS 00000000001953c8 001953c8 000000000002a3c4 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.so 00001648 0000001c 0000164c FDE cie=00000000 pc=00015ea0..00015ebe LOC 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..00015ebe LOC 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 0b612f0ec4bed223ca59e4172 /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.so 1  55F33FB8F1A8 C1A8 sub_B1E0+FC8 /usr/lib/systemd/systemd-journald 2  55F33FB91A3F EA3F sub_E880+1BF /usr/lib/systemd/systemd-journald - [Stack API] : ftruncate64+7(F75C7) 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207094.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午2:27
下一篇 2026年3月19日 下午2:28


相关推荐

  • Codeforces 110B-Lucky String(技能)

    Codeforces 110B-Lucky String(技能)

    2022年1月8日
    51
  • IDEA安装教程(傻瓜式安装)

    IDEA安装教程(傻瓜式安装)IDEA安装教程1.文件下载1.idea下载2.PJ文件下载2.idea安装步骤3.PJ导包1.文件下载1.idea下载下载地址.版本为2020.1为例2.PJ文件下载下载地址.密码:d79t选择版本进行下载。2.idea安装步骤1.双击打开软件,点击Next2.选择安装目录,然后点击Next(然后会卡一会,取决于电脑性能,在此操作之间,不要着急)3.选择64位,就可以,其他选项看自己需要,然后点击Next4.无需选择,直接点击Install,5.然后点击Finish,完成

    2022年10月2日
    4
  • Office 2007或Office 2010套件初始安装中断后无法重新启动安装程序,错误“Microsoft Office xxx在安装过程中出错”…[通俗易懂]

    大家好,不知道大家在安装Office2007或Office2010时有没有遇到过这样的现象,在您第一次安装Office2007或Office2010套件时,因为某种原因安装中断,当您试图重新安装相同的Office套件时,安装失败并且收到如下的错误提示MicrosoftOffice<具体Office套件名>在安装过程中出错.具体祥见下图:其实出现这个错误的原因可能是因为在您上一次安…

    2022年4月3日
    154
  • 几款强大的网页生成工具[通俗易懂]

    几款强大的网页生成工具[通俗易懂]Carrd这款软件是免费的,可以帮助初学者制作一个简单、响应快捷的网页。链接:https://carrd.co/2.TemplateStash这款软件几乎集合了所有类型网页的模板,你可以通过关键词检索来找到你想要的主题风格。链接:http://www.templatestash.com/3.Bubble这款软件的优势在于使用者不用掌握任何编程技巧就可以制作网页,它独特的…

    2022年5月11日
    53
  • 霍夫曼编码代码matlab,matlab 实现霍夫曼编码

    霍夫曼编码代码matlab,matlab 实现霍夫曼编码编码内容包括 用 matlab 实现霍夫曼编码 并且求出相应的信源熵 平均码长 和编码效率 以下是代码 霍夫曼编码 huffman code 编码思路 根据位置矩阵的变化过程反推生成霍夫曼编码 n input 请输入编码个数 n c fori 1 n fprintf 请输入第 d 个编码 n i c i input endc rand 1

    2026年3月18日
    1
  • 招聘考试图形推理题_图形推理历年真题

    招聘考试图形推理题_图形推理历年真题图形推理50中规律,自行阅读1.大小变化2.方向旋转3.笔画增减(数字,线条数)4.图形求同5.相同部份去掉6.图形叠加(简单叠加,合并叠加,去同叠加)7.图形组合变化(如:首尾两个图形中都包含中间图形)8.对应位置阴影变化(两图相同或不同则第三图对应位置变阴影或变空白)9.顺时针或逆时针旋转10.总笔画成等差数列…

    2025年10月11日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号