我提供的信息非常有限,我知道,但这可能就足够了。
系统规格: MIPS 64 位处理器,8 个内核,每个内核运行 4 个虚拟 CPU。
操作系统:一些基于 2.6.32.9 内核的专有 Linux
进程:一个运行 7 个 posix 线程的简单用户级进程。这个特定的应用程序在核心 0 上运行,它与任何进程都没有任何 cpu 亲和性。
崩溃几乎不可能重现。没有具体的场景。我们知道,如果我们对应用程序执行一些次要活动,它可能每天崩溃一次。
崩溃的特定线程每 5 毫秒唤醒一次,从一个共享内存区域读取信息并更新另一个。而已。
没有太多的活动。这个过程不是很辛苦。
现在:当我打开核心并加载应用程序的无符号图像时,gdb 指向指令 100661e0。指令 100661e0 如下所示(使用未剥离图像的 objdump 视图查看):
void class::foo(uint8_t factor)
{
100661d8: ffbf0018 sd ra,24(sp)
100661dc: 0080802d move s0,a0
bar(factor, shared_memory_a->profiles[PROFILE_1]);
100661e0: 0c019852 jal 10066148 <_ZN28class35barEhR30profile_t>
100661e4: 64c673c8 daddiu a2,a2,29640
bar(factor, shared_memory_a->profiles[PROFILE_2]);
100661e8: de060010 ld a2,16(s0)
显示为异常行的行是
100661e0: 0c019852 jal 10066148 <_ZN28class35barEhR30profile_t>
请注意,10066148 是有效指令。
Bad 寄存器包含以下地址,该地址已对齐,但就指令地址空间而言看起来无效:c0000003ddc5dd90
原因寄存器包含以下值:0000000000800014
我不明白为什么 Bad 寄存器会显示它的值,其中指令明确说明了有效指令。我有点担心分支延迟槽问题,但是当我使用简单的 C++ 运行用户态应用程序时,我不应该担心这些问题。
我会很感激任何想法。