c++ - 您如何阅读 segfault 内核日志消息

标签 c++ c unix segmentation-fault syslog

这可能是一个非常简单的问题,我正在尝试调试在 kern.log

中生成以下段错误的应用程序

kernel: myapp[15514]: segfault at 794ef0 ip 080513b sp 794ef0 error 6 in myapp[8048000+24000]

这是我的问题:

  1. 是否有任何文档说明 segfault 上的 diff 错误编号是什么,在这种情况下是错误 6,但我看到了错误 4、5

  2. 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 - 代码试图访问的内存位置(很可能 1011 是我们期望设置为有效值但指向 0 的指针的偏移量)
  • ip - 指令指针,即。尝试执行此操作的代码所在的位置
  • sp - 堆栈指针
  • error - 特定于架构的标志;见 arch/*/mm/fault.c适合您的平台。

关于c++ - 您如何阅读 segfault 内核日志消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2179403/

相关文章:

c++ - 编译优化与编译目标的区别是什么

c++ - 覆盖静态类函数的默认 SWIG 名称

c - 让程序在 C 中重复输入

linux - 在 bash 脚本中使用 While 循环的问题(将文件拆分为多个文件)

linux - 找出符号链接(symbolic link)的位置,Linux?

c++ - openmp 在使用少于线程时如何工作

C++ 在函数中传递指针地址

c - 为什么默认情况下不剥离用gcc编译的二进制文件

c - Makefile 覆盖自身

python - 如何将一个大文件分割成多个文件?