【问题标题】:What are the meaning of the items in the "alignment trap" error message?“对齐陷阱”错误消息中的项目是什么意思?
【发布时间】:2013-04-02 02:51:21
【问题描述】:

在调试过程中,我收到以下错误消息。

Alignment trap: my_main (29858) PC=0x00170ad8 Instr=0xe5960008 Address=0x00f28daa FSR 0x0f3

我环顾四周,发现了很多关于这个(broken link)real-time embedded website 的信息。 所以现在我知道PCInstr 指的是什么,但我仍然没有找到关于AddressFSR 部分的任何信息。

FSR 是什么? Address 指的是什么地址?根据proc/xxxx/maps,该地址甚至超出了我的程序范围。有谁知道最后两项是什么意思?我需要这些信息来解决这个对齐问题。

地图输出

00008000-001fe000 r-xp 00000000 03:02 16204      /home/myuser/my_main
00205000-00248000 rw-p 001f5000 03:02 16204      /home/myuser/my_main
00248000-00299000 rwxp 00248000 00:00 0
40000000-40018000 r-xp 00000000 03:01 2095       /lib/ld-2.3.3.so
40018000-4001b000 rw-p 40018000 00:00 0
4001f000-40020000 r--p 00017000 03:01 2095       /lib/ld-2.3.3.so
40020000-40021000 rw-p 00018000 03:01 2095       /lib/ld-2.3.3.so
40021000-40023000 r-xp 00000000 03:01 15724      /usr/lib/libem7.so.1.0.1
40023000-40029000 ---p 00002000 03:01 15724      /usr/lib/libem7.so.1.0.1
40029000-4002b000 rw-p 00000000 03:01 15724      /usr/lib/libem7.so.1.0.1
4002b000-40031000 r-xp 00000000 03:01 2057       /lib/tls/librt-2.3.3.so
40031000-40033000 ---p 00006000 03:01 2057       /lib/tls/librt-2.3.3.so
40033000-40038000 rw-p 00000000 03:01 2057       /lib/tls/librt-2.3.3.so
40038000-40039000 r--p 00005000 03:01 2057       /lib/tls/librt-2.3.3.so
40039000-4003a000 rw-p 00006000 03:01 2057       /lib/tls/librt-2.3.3.so
4003a000-4004a000 r-xp 00000000 03:01 2060       /lib/tls/libpthread-2.3.3.so
4004a000-40051000 rw-p 00008000 03:01 2060       /lib/tls/libpthread-2.3.3.so
40051000-40052000 r--p 0000f000 03:01 2060       /lib/tls/libpthread-2.3.3.so
40052000-40053000 rw-p 00010000 03:01 2060       /lib/tls/libpthread-2.3.3.so
40053000-40055000 rw-p 40053000 00:00 0
40055000-4010e000 r-xp 00000000 03:01 15703      /usr/lib/libstdc++.so.6.0.3
4010e000-40115000 ---p 000b9000 03:01 15703      /usr/lib/libstdc++.so.6.0.3
40115000-40119000 rw-p 000b8000 03:01 15703      /usr/lib/libstdc++.so.6.0.3
40119000-4011f000 rw-p 40119000 00:00 0
4011f000-401b7000 r-xp 00000000 03:01 2076       /lib/tls/libm-2.3.3.so
401b7000-401be000 rw-p 00090000 03:01 2076       /lib/tls/libm-2.3.3.so
401be000-401bf000 r--p 00097000 03:01 2076       /lib/tls/libm-2.3.3.so
401bf000-401c0000 rw-p 00098000 03:01 2076       /lib/tls/libm-2.3.3.so
401c0000-401c8000 r-xp 00000000 03:01 2005       /lib/libgcc_s.so.1
401c8000-401c9000 rw-p 00008000 03:01 2005       /lib/libgcc_s.so.1
401c9000-402cb000 r-xp 00000000 03:01 2078       /lib/tls/libc-2.3.3.so
402cb000-402d1000 ---p 00102000 03:01 2078       /lib/tls/libc-2.3.3.so
402d1000-402d2000 rw-p 00100000 03:01 2078       /lib/tls/libc-2.3.3.so
402d2000-402d4000 r--p 00101000 03:01 2078       /lib/tls/libc-2.3.3.so
402d4000-402d6000 rw-p 00103000 03:01 2078       /lib/tls/libc-2.3.3.so
402d6000-402d8000 rw-p 402d6000 00:00 0
402d8000-402e5000 rw-s 00000000 00:07 0          /SYSV12345678 (deleted)
402e5000-402e6000 ---p 402e5000 00:00 0
402e6000-402f5000 rwxp 402e6000 00:00 0
403c1000-4049d000 rw-p 403c1000 00:00 0
7efeb000-7f000000 rwxp 7efeb000 00:00 0

【问题讨论】:

    标签: c linux-kernel arm embedded-linux


    【解决方案1】:
    PC=0x00170ad8
    

    这告诉你程序计数器的当前值,它可以用来确定你的程序中的哪条指令导致了陷阱。如果您像我想的那样在 ARM 上,这实际上是当前指令加 8,因此导致陷阱的指令位于 0x00170ad0

    Instr=0xe5960008
    

    这是错误指令的编码。如果这是在 ARM 上,则该指令为 ldr r0, [r6, #8]

    Address=0x00f28daa
    

    这告诉您程序尝试加载的地址,导致错误。假设到目前为止其他一切都是正确的,这是r6 + 8,所以r6 在故障发生时保持0x00f28da2

    FSR 0xf3
    

    这是保存在故障状态寄存器中的值。它告诉您发生了什么故障。此特定值是对齐错误的较旧编码(ARMv7 之前)。

    【讨论】:

    • 还有一件事,你怎么知道“Instr=0xe5960008”是“ldr r0, [r6, #8]”。 objdump 确实是这么说的。
    • @NazeKimi:我只是通过参考ARM参考手册解码它。
    【解决方案2】:

    您的 CPU 很可能不支持对未对齐地址的值的内存进行读/写。如果您访问的是 4 字节变量,那么显然 Address=0x00f28daa 不是 4 的倍数。在任意对齐的地址中只能读取/写入单个字节。

    那篇文章解释得很好。

    【讨论】:

    • 感谢您的回答。但我想我的问题并不清楚。我实际上想知道这些项目到底指的是什么。它们是被读取还是写入的内存地址?我需要有关该地址是什么的信息来解决这个对齐问题。
    • 0x00f28daa 不在地图中。我敢打赌它是通过指针算术和/或指针转换获得的指针,它指向数据部分(包括rodata和bss)或堆栈或堆中的一些数据。在调试器中运行您的代码。你会很快找出问题所在。
    • 另一种可能是您的指针未初始化或损坏。
    • 投反对票?这个答案是错误的吗?问题?还是不够详细/令人信服/等等?
    • 答案不回答问题,问题是关于输出的含义,而不是输出的原因。
    猜你喜欢
    • 1970-01-01
    • 2015-02-20
    • 2012-07-14
    • 2012-10-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多