【发布时间】:2017-11-07 03:45:01
【问题描述】:
需要帮助使用 gdb 调试共享库。
我正在尝试调试一个共享库,就我而言,它是:
libc-2.23.so
原因是我在 dmesg 中得到了这些行:
[10081.433266] compiz[11346]: segfault at 7f30a4100010 ip 00007f309c36f44b sp 00007ffdde303aa0 error 4 in libc-2.23.so[7f309c2f1000+1bf000]
[22005.764635] compiz[16149]: segfault at 7f30e3456db0 ip 00007f30db85044b sp 00007fffaab9c0a0 error 4 in libc-2.23.so[7f30db7d2000+1bf000]
[48777.031064] compiz[25203]: segfault at 7f0b8e23b050 ip 00007f0b87edf44b sp 00007ffd51d15740 error 4 in libc-2.23.so[7f0b87e61000+1bf000]
[78850.413793] compiz[4889]: segfault at 7f60ddbf2440 ip 00007f60d598944b sp 00007ffedc5e31b0 error 4 in libc-2.23.so[7f60d590b000+1bf000]
[84583.754783] compiz[8441]: segfault at 7f5f8c3930c0 ip 00007f5f871d544b sp 00007ffc436bb5a0 error 4 in libc-2.23.so[7f5f87157000+1bf000]
[100625.457854] compiz[15619]: segfault at 7ffffa967680 ip 00007ffff722844b sp 00007fffffffdad0 error 4 in libc-2.23.so[7ffff71aa000+1bf000]
[104234.596331] compiz[19076]: segfault at 7ffffa2dc540 ip 00007ffff722844b sp 00007fffffffd810 error 4 in libc-2.23.so[7ffff71aa000+1bf000]
[112314.238115] compiz[22152]: segfault at 7ffffe232760 ip 00007ffff722844b sp 00007fffffffd810 error 4 in libc-2.23.so[7ffff71aa000+1bf000]
[130828.195732] compiz[26013]: segfault at 7ffffa966180 ip 00007ffff722844b sp 00007fffffffdad0 error 4 in libc-2.23.so[7ffff71aa000+1bf000]
[225379.026592] compiz[19275]: segfault at 7ffff821b6d0 ip 00007ffff722844b sp 00007fffffffd7c0 error 4 in libc-2.23.so[7ffff71aa000+1bf000]
自从我运行命令以来,加载libc-2.23.so的地址在时间戳100625.457854之后没有改变:
$ 回声 0 | sudo tee /proc/sys/kernel/randomize_va_space
为了能够在gdb下加载它。
到目前为止,我所做的是我已经确定段错误总是发生在与共享库加载地址相同的偏移量上。
我通过在python中用指令指针减去加载地址来计算偏移量:
ld = ["7f309c2f1000", "7f30db7d2000", "7f0b87e61000", "7f60d590b000", "7f5f87157000", "7ffff71aa000"]
ip = ["7f309c36f44b", "7f30db85044b", "7f0b87edf44b", "7f60d598944b", "7f5f871d544b", "7ffff722844b"]
ld_val = [int(x,16) for x in ld]
ip_val=[int(x,16) for x in ip]
ip_off=[i-s for (i,s) in zip(ip_val,ld_val)]
ip_off
[517195, 517195, 517195, 517195, 517195, 517195]
所以使用这些信息我得到了执行中的违规行:
$ addr2line -e /lib/x86_64-linux-gnu/libc-2.23.so -fCi 0x7e44b
malloc_consolidate
/build/glibc-9tT8Do/glibc-2.23/malloc/malloc.c:4167
自从我运行 Ubuntu 16.04 以来,我通过发出以下命令安装了源代码:
$ apt-get source glibc-source
检查有问题的行表明它只是一个注释。
malloc.c:4167
/* Slightly streamlined version of consolidation code in free() */
内部函数:
static void malloc_consolidate(mstate av)
所以我假设我在这里做错了什么。
有关如何捕获此“段错误”的任何指针?
【问题讨论】:
-
我想看到的是执行
catch throw(捕获异常)然后backtrace(显示调用堆栈)之后的输出。这将为我们提供问题出处的线索,因为它更有可能出现在您自己的代码中,而不是glibc。 -
感谢您的回答,但 compiz 不是我的代码,即使是我仍然需要知道将 catch throw 代码放在哪里。
-
这两个命令都是针对
gdb执行程序前的;如果问题出在compiz,请向维护人员提交错误。顺便说一句,this might be one area to investigate. -
我按照帖子上的说明进行了调查,但仍然坚持 apport-retrace 找不到 compiz_0.9.12.2+16.04.20160823-0ubuntu1.dsc 的公钥。将继续,因为它应该是可能的。
-
运行
apt-get source glibc-source时是否有任何警告消息?我刚刚运行它,malloc.c 的第 4167 行是nextsize = chunksize(nextchunk);。您第 4167 行中的注释在我的第 4164 行中。这可能是因为您的apt-get source没有应用debian/patches/git-updates.diff补丁,该补丁删除了第 1074 行周围的几行。
标签: linux segmentation-fault gdb glibc