linux - 了解 GDB 和段错误消息

标签 linux gdb segmentation-fault shared-libraries

我最近调试了一个定期出现段错误的应用程序——我解决了这个问题,这个问题相对普通(从空指针读取),但我还有一些无法解决的遗留问题我自己的。

在大多数情况下,gdb 堆栈跟踪是这样开始的:

0x00007fdff330059f in __strlen_sse42 () from /lib64/libc.so.6

使用/proc/[my proc id]/maps 中的信息获取共享库的基地址,我可以看到问题发生在共享库的同一指令上——指令 0x13259f,即

pcmpeqb (%rdi),%xmm1 (gdb)

到目前为止,还不错。但是,操作系统 (linux) 也会向/var/logs/messags 写出一条错误消息,看起来像这样

[3540502.783205] node[24638]: segfault at 0 ip 00007f8abbe6459f sp 00007fff7bf2f148 error 4 in libc-2.12.so[7f8abbd32000+189000]

这让我很困惑。一方面,内核正确识别了错误(用户模式保护错误),并且通过从指令指针中减去共享库的基地址,我们得到了与我们相同的相对偏移量——0x13259f——由 gdb 做。但是内核识别的库不一样,指令的地址不一样,那个库里面的函数和指令也不一样。即libc-2-12.so里面的指令是

0x13259f <__memset_sse2+911>:  movdqa %xmm0,-0x43(%edx)

所以,我的问题是,gdb 和内核消息如何就故障类型以及指令相对于共享库基地址的偏移量达成一致,但在指令指针的地址和正在使用的共享库?

最佳答案

But the library the kernel identifies is different,

不,不是。做ls -l /lib64/libc.so.6 , 你会看到它是 libc-2.12.so 的符号链接(symbolic link).

the address of the instruction is different

内核消息用于与您在 GDB 中观察到的不同的执行,并且 address randomization造成libc-2.12.so在不同的基地址加载。

and the function and instruction within that library is different. That is, the instruction within libc-2-12.so is 0x13259f <__memset_sse2+911>: movdqa %xmm0,-0x43(%edx)

很可能您查看的 libc-2.12.so 与实际使用的不同。

关于linux - 了解 GDB 和段错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16904417/

相关文章:

linux - 有谁知道 docker 中无新权限阻止 selinux 转换的解决方法?

c - 调试符号是什么样的?

linux - 没有可用的符号表信息

segmentation-fault - Linux 上的段错误是什么?

linux - 具有命令选择性根权限的 Bash 脚本

linux - 如何循环遍历脚本中的某些文件?

php - Composer 安装/更新不起作用

c++ - 你如何使用 emacs 在 linux 中调试 c/c++ 源代码?

c++ - C++ 的核心转储段错误

c - 在一个函数而不是另一个函数中访问同一内存时发生段错误