【问题标题】:unhandled level 3 permission fault (11) [ error disappears when running gdb...! ]未处理的 3 级权限错误 (11) [运行 gdb 时错误消失...! ]
【发布时间】:2016-02-01 21:55:11
【问题描述】:

所以我试图在 aarch64(ARM 8) 上运行我的 c++ 应用程序。 ***当使用 GDB 运行时,应用程序运行没有任何问题。但否则它会给我一个分段错误。***我检查了 dmesg,它是

unhandled level 3 permission fault (11) at 0x004ac010, esr 0x8300000f

[241808.064733] pgd = ffffffc0fe270000

[241808.068270] [004ac010] *pgd=00000001615c9003, *pmd=000000016f316003, *pte=02e0000147f42f53

[241808.076813] 

[241808.076824] CPU: 2 PID: 12503 Comm: Jumpi Not tainted 3.10.67-g3a5c467 #1

[241808.076832] task: ffffffc0fef9c080 ti: ffffffc0f0fe4000 task.ti: ffffffc0f0fe4000

[241808.076841] PC is at 0x4ac010

[241808.076846] LR is at 0x401cb8

[241808.076852] pc : [<00000000004ac010>] lr : [<0000000000401cb8>] pstate: 20000000

[241808.076857] sp : 0000007fc044b600

[241808.076863] x29: 0000007fc044b680 x28: 0000000000000000

[241808.076873] x27: 0000000000000000 x26: 0000000000000000 

[241808.076882] x25: 00000000004186ec x24: 0000000000418634

我尝试在 gdb 中设置禁用随机化,但仍然没有错误。然后我尝试了 valgrind。我收到很多错误消息,说创建了统一值,主要是在 dl_init_paths。但更重要的是,我在内存地址获得了错误的权限生成 SISGEV,当我通过内存时,它似乎在 (env_path_list) 中。 我在调试了几个小时后所处的位置。如果有人对下一步有帮助的建议/想法。 另一个有趣的事实是,当使用交叉编译器编译相同的代码并在此(ARM8)上运行时,它可以正常工作......!!

【问题讨论】:

  • 根据这些地址的猜测,您似乎正在尝试执行您的数据部分,它带有未初始化的指针的味道。我的心理预测是,你在某个地方调用了一个已释放对象的虚拟方法。
  • 你看核心转储了吗?

标签: gcc gdb arm valgrind arm64


【解决方案1】:

您可以在故障转储中已打印的“esr”寄存器中找到详细的故障原因。您可以使用 armv8 规范来解码 'esr' 寄存器的值。

【讨论】:

  • @kfsone 实际上是的,原因在故障转储中已经提到 - 权限错误。 BTW 作为解决方案,作者可以使用 aarch64 cross-tools 中的 objdump 工具来读取 elf 文件并尝试找出问题所在。好的起点是使用 LR 寄存器 (0x401cb8) 的值来创建问题代码。
猜你喜欢
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-21
相关资源
最近更新 更多