这可能是一个非常简单的问题,我正在尝试调试在 kern.log
kernel: myapp[15514]: segfault at 794ef0 ip 080513b sp 794ef0 error 6 in myapp[8048000+24000]
这是我的问题:
是否有任何文档说明 segfault 上的 diff 错误编号是什么,在这种情况下是错误 6,但我看到了错误 4、5
bf794ef0 ip 0805130b sp bf794ef0和myapp[8048000+24000]处的信息
是什么意思
?
到目前为止,我能够使用符号进行编译,当我执行 x 0x8048000+24000
时,它会返回一个符号,这是正确的做法吗?到目前为止,我的假设如下:
- sp = 堆栈指针?
- ip = 指令指针
- 在 = ????
- myapp[8048000+24000] = 符号地址?
最佳答案
当报告指向一个程序,而不是一个共享库时
运行 addr2line -e myapp 080513b
(并重复给定的其他指令指针值)以查看错误发生的位置。更好的是,获取带有调试工具的构建,然后在 gdb 等调试器下重现问题。
如果是共享库
在 libfoo.so[NNNNNN+YYYY]
部分,NNNNNN
是加载库的位置。从指令指针( ip
)中减去它,您将得到 .so
的偏移量。的违规指令。然后你可以使用 objdump -DCgl libfoo.so
并在该偏移处搜索指令。您应该能够很容易地从 asm 标签中找出它是哪个函数。如果 .so
没有优化你也可以尝试使用addr2line -e libfoo.so <offset>
.
错误是什么意思
以下是字段的 segmentation :
-
address
- 代码试图访问的内存位置(很可能10
和11
是我们期望设置为有效值但指向0
的指针的偏移量) -
ip
- 指令指针,即。尝试执行此操作的代码所在的位置 -
sp
- 堆栈指针 -
error
- 特定于架构的标志;见arch/*/mm/fault.c
适合您的平台。
关于c++ - 您如何阅读 segfault 内核日志消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2179403/